src/http/ngx_http_upstream_round_robin.h - nginx source code

Data types defined

Functions defined

Macros defined

Source code


  1. /*
  2. * Copyright (C) Igor Sysoev
  3. * Copyright (C) Nginx, Inc.
  4. */


  5. #ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
  6. #define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_


  7. #include <ngx_config.h>
  8. #include <ngx_core.h>
  9. #include <ngx_http.h>


  10. typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;
  11. typedef struct ngx_http_upstream_rr_peer_s   ngx_http_upstream_rr_peer_t;


  12. #if (NGX_HTTP_UPSTREAM_ZONE)

  13. typedef struct {
  14.     ngx_event_t                     event;         /* must be first */
  15.     ngx_uint_t                      worker;
  16.     ngx_str_t                       name;
  17.     ngx_str_t                       service;
  18.     time_t                          valid;
  19.     ngx_http_upstream_rr_peers_t   *peers;
  20.     ngx_http_upstream_rr_peer_t    *peer;
  21. } ngx_http_upstream_host_t;

  22. #endif


  23. struct ngx_http_upstream_rr_peer_s {
  24.     struct sockaddr                *sockaddr;
  25.     socklen_t                       socklen;
  26.     ngx_str_t                       name;
  27.     ngx_str_t                       server;

  28.     ngx_int_t                       current_weight;
  29.     ngx_int_t                       effective_weight;
  30.     ngx_int_t                       weight;

  31.     ngx_uint_t                      conns;
  32.     ngx_uint_t                      max_conns;

  33.     ngx_uint_t                      fails;
  34.     time_t                          accessed;
  35.     time_t                          checked;

  36.     ngx_uint_t                      max_fails;
  37.     time_t                          fail_timeout;
  38.     ngx_msec_t                      slow_start;
  39.     ngx_msec_t                      start_time;

  40.     ngx_uint_t                      down;

  41. #if (NGX_HTTP_SSL || NGX_COMPAT)
  42.     void                           *ssl_session;
  43.     int                             ssl_session_len;
  44. #endif

  45. #if (NGX_HTTP_UPSTREAM_ZONE)
  46.     unsigned                        zombie:1;

  47.     ngx_atomic_t                    lock;
  48.     ngx_uint_t                      refs;
  49.     ngx_http_upstream_host_t       *host;
  50. #endif

  51.     ngx_http_upstream_rr_peer_t    *next;

  52.     NGX_COMPAT_BEGIN(15)
  53.     NGX_COMPAT_END
  54. };


  55. struct ngx_http_upstream_rr_peers_s {
  56.     ngx_uint_t                      number;

  57. #if (NGX_HTTP_UPSTREAM_ZONE)
  58.     ngx_slab_pool_t                *shpool;
  59.     ngx_atomic_t                    rwlock;
  60.     ngx_uint_t                     *config;
  61.     ngx_http_upstream_rr_peer_t    *resolve;
  62.     ngx_http_upstream_rr_peers_t   *zone_next;
  63. #endif

  64.     ngx_uint_t                      total_weight;
  65.     ngx_uint_t                      tries;

  66.     unsigned                        single:1;
  67.     unsigned                        weighted:1;

  68.     ngx_str_t                      *name;

  69.     ngx_http_upstream_rr_peers_t   *next;

  70.     ngx_http_upstream_rr_peer_t    *peer;
  71. };


  72. #if (NGX_HTTP_UPSTREAM_ZONE)

  73. #define ngx_http_upstream_rr_peers_rlock(peers)                               \
  74.                                                                               \
  75.     if (peers->shpool) {                                                      \
  76.         ngx_rwlock_rlock(&peers->rwlock);                                     \
  77.     }

  78. #define ngx_http_upstream_rr_peers_wlock(peers)                               \
  79.                                                                               \
  80.     if (peers->shpool) {                                                      \
  81.         ngx_rwlock_wlock(&peers->rwlock);                                     \
  82.     }

  83. #define ngx_http_upstream_rr_peers_unlock(peers)                              \
  84.                                                                               \
  85.     if (peers->shpool) {                                                      \
  86.         ngx_rwlock_unlock(&peers->rwlock);                                    \
  87.     }


  88. #define ngx_http_upstream_rr_peer_lock(peers, peer)                           \
  89.                                                                               \
  90.     if (peers->shpool) {                                                      \
  91.         ngx_rwlock_wlock(&peer->lock);                                        \
  92.     }

  93. #define ngx_http_upstream_rr_peer_unlock(peers, peer)                         \
  94.                                                                               \
  95.     if (peers->shpool) {                                                      \
  96.         ngx_rwlock_unlock(&peer->lock);                                       \
  97.     }


  98. #define ngx_http_upstream_rr_peer_ref(peers, peer)                            \
  99.     (peer)->refs++;


  100. static ngx_inline void
  101. ngx_http_upstream_rr_peer_free_locked(ngx_http_upstream_rr_peers_t *peers,
  102.     ngx_http_upstream_rr_peer_t *peer)
  103. {
  104.     if (peer->refs) {
  105.         peer->zombie = 1;
  106.         return;
  107.     }

  108.     ngx_slab_free_locked(peers->shpool, peer->sockaddr);
  109.     ngx_slab_free_locked(peers->shpool, peer->name.data);

  110.     if (peer->server.data) {
  111.         ngx_slab_free_locked(peers->shpool, peer->server.data);
  112.     }

  113. #if (NGX_HTTP_SSL)
  114.     if (peer->ssl_session) {
  115.         ngx_slab_free_locked(peers->shpool, peer->ssl_session);
  116.     }
  117. #endif

  118.     ngx_slab_free_locked(peers->shpool, peer);
  119. }


  120. static ngx_inline void
  121. ngx_http_upstream_rr_peer_free(ngx_http_upstream_rr_peers_t *peers,
  122.     ngx_http_upstream_rr_peer_t *peer)
  123. {
  124.     ngx_shmtx_lock(&peers->shpool->mutex);
  125.     ngx_http_upstream_rr_peer_free_locked(peers, peer);
  126.     ngx_shmtx_unlock(&peers->shpool->mutex);
  127. }


  128. static ngx_inline ngx_int_t
  129. ngx_http_upstream_rr_peer_unref(ngx_http_upstream_rr_peers_t *peers,
  130.     ngx_http_upstream_rr_peer_t *peer)
  131. {
  132.     peer->refs--;

  133.     if (peers->shpool == NULL) {
  134.         return NGX_OK;
  135.     }

  136.     if (peer->refs == 0 && peer->zombie) {
  137.         ngx_http_upstream_rr_peer_free(peers, peer);
  138.         return NGX_DONE;
  139.     }

  140.     return NGX_OK;
  141. }

  142. #else

  143. #define ngx_http_upstream_rr_peers_rlock(peers)
  144. #define ngx_http_upstream_rr_peers_wlock(peers)
  145. #define ngx_http_upstream_rr_peers_unlock(peers)
  146. #define ngx_http_upstream_rr_peer_lock(peers, peer)
  147. #define ngx_http_upstream_rr_peer_unlock(peers, peer)
  148. #define ngx_http_upstream_rr_peer_ref(peers, peer)
  149. #define ngx_http_upstream_rr_peer_unref(peers, peer)  NGX_OK

  150. #endif


  151. typedef struct {
  152.     ngx_uint_t                      config;
  153.     ngx_http_upstream_rr_peers_t   *peers;
  154.     ngx_http_upstream_rr_peer_t    *current;
  155.     uintptr_t                      *tried;
  156.     uintptr_t                       data;
  157. } ngx_http_upstream_rr_peer_data_t;


  158. ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
  159.     ngx_http_upstream_srv_conf_t *us);
  160. ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
  161.     ngx_http_upstream_srv_conf_t *us);
  162. ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
  163.     ngx_http_upstream_resolved_t *ur);
  164. ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
  165.     void *data);
  166. void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
  167.     void *data, ngx_uint_t state);

  168. #if (NGX_HTTP_SSL)
  169. ngx_int_t
  170.     ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
  171.     void *data);
  172. void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
  173.     void *data);
  174. #endif


  175. #endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */