src/stream/ngx_stream_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_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
  6. #define _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_


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


  10. typedef struct ngx_stream_upstream_rr_peers_s  ngx_stream_upstream_rr_peers_t;
  11. typedef struct ngx_stream_upstream_rr_peer_s   ngx_stream_upstream_rr_peer_t;


  12. #if (NGX_STREAM_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_stream_upstream_rr_peers_t  *peers;
  20.     ngx_stream_upstream_rr_peer_t   *peer;
  21. } ngx_stream_upstream_host_t;

  22. #endif


  23. struct ngx_stream_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.     void                            *ssl_session;
  42.     int                              ssl_session_len;

  43. #if (NGX_STREAM_UPSTREAM_ZONE)
  44.     unsigned                         zombie:1;

  45.     ngx_atomic_t                     lock;
  46.     ngx_uint_t                       refs;
  47.     ngx_stream_upstream_host_t      *host;
  48. #endif

  49.     ngx_stream_upstream_rr_peer_t   *next;

  50.     NGX_COMPAT_BEGIN(14)
  51.     NGX_COMPAT_END
  52. };


  53. struct ngx_stream_upstream_rr_peers_s {
  54.     ngx_uint_t                       number;

  55. #if (NGX_STREAM_UPSTREAM_ZONE)
  56.     ngx_slab_pool_t                 *shpool;
  57.     ngx_atomic_t                     rwlock;
  58.     ngx_uint_t                      *config;
  59.     ngx_stream_upstream_rr_peer_t   *resolve;
  60.     ngx_stream_upstream_rr_peers_t  *zone_next;
  61. #endif

  62.     ngx_uint_t                       total_weight;
  63.     ngx_uint_t                       tries;

  64.     unsigned                         single:1;
  65.     unsigned                         weighted:1;

  66.     ngx_str_t                       *name;

  67.     ngx_stream_upstream_rr_peers_t  *next;

  68.     ngx_stream_upstream_rr_peer_t   *peer;
  69. };


  70. #if (NGX_STREAM_UPSTREAM_ZONE)

  71. #define ngx_stream_upstream_rr_peers_rlock(peers)                             \
  72.                                                                               \
  73.     if (peers->shpool) {                                                      \
  74.         ngx_rwlock_rlock(&peers->rwlock);                                     \
  75.     }

  76. #define ngx_stream_upstream_rr_peers_wlock(peers)                             \
  77.                                                                               \
  78.     if (peers->shpool) {                                                      \
  79.         ngx_rwlock_wlock(&peers->rwlock);                                     \
  80.     }

  81. #define ngx_stream_upstream_rr_peers_unlock(peers)                            \
  82.                                                                               \
  83.     if (peers->shpool) {                                                      \
  84.         ngx_rwlock_unlock(&peers->rwlock);                                    \
  85.     }


  86. #define ngx_stream_upstream_rr_peer_lock(peers, peer)                         \
  87.                                                                               \
  88.     if (peers->shpool) {                                                      \
  89.         ngx_rwlock_wlock(&peer->lock);                                        \
  90.     }

  91. #define ngx_stream_upstream_rr_peer_unlock(peers, peer)                       \
  92.                                                                               \
  93.     if (peers->shpool) {                                                      \
  94.         ngx_rwlock_unlock(&peer->lock);                                       \
  95.     }


  96. #define ngx_stream_upstream_rr_peer_ref(peers, peer)                          \
  97.     (peer)->refs++;


  98. static ngx_inline void
  99. ngx_stream_upstream_rr_peer_free_locked(ngx_stream_upstream_rr_peers_t *peers,
  100.     ngx_stream_upstream_rr_peer_t *peer)
  101. {
  102.     if (peer->refs) {
  103.         peer->zombie = 1;
  104.         return;
  105.     }

  106.     ngx_slab_free_locked(peers->shpool, peer->sockaddr);
  107.     ngx_slab_free_locked(peers->shpool, peer->name.data);

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

  111. #if (NGX_STREAM_SSL)
  112.     if (peer->ssl_session) {
  113.         ngx_slab_free_locked(peers->shpool, peer->ssl_session);
  114.     }
  115. #endif

  116.     ngx_slab_free_locked(peers->shpool, peer);
  117. }


  118. static ngx_inline void
  119. ngx_stream_upstream_rr_peer_free(ngx_stream_upstream_rr_peers_t *peers,
  120.     ngx_stream_upstream_rr_peer_t *peer)
  121. {
  122.     ngx_shmtx_lock(&peers->shpool->mutex);
  123.     ngx_stream_upstream_rr_peer_free_locked(peers, peer);
  124.     ngx_shmtx_unlock(&peers->shpool->mutex);
  125. }


  126. static ngx_inline ngx_int_t
  127. ngx_stream_upstream_rr_peer_unref(ngx_stream_upstream_rr_peers_t *peers,
  128.     ngx_stream_upstream_rr_peer_t *peer)
  129. {
  130.     peer->refs--;

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

  134.     if (peer->refs == 0 && peer->zombie) {
  135.         ngx_stream_upstream_rr_peer_free(peers, peer);
  136.         return NGX_DONE;
  137.     }

  138.     return NGX_OK;
  139. }

  140. #else

  141. #define ngx_stream_upstream_rr_peers_rlock(peers)
  142. #define ngx_stream_upstream_rr_peers_wlock(peers)
  143. #define ngx_stream_upstream_rr_peers_unlock(peers)
  144. #define ngx_stream_upstream_rr_peer_lock(peers, peer)
  145. #define ngx_stream_upstream_rr_peer_unlock(peers, peer)
  146. #define ngx_stream_upstream_rr_peer_ref(peers, peer)
  147. #define ngx_stream_upstream_rr_peer_unref(peers, peer)  NGX_OK

  148. #endif


  149. typedef struct {
  150.     ngx_uint_t                       config;
  151.     ngx_stream_upstream_rr_peers_t  *peers;
  152.     ngx_stream_upstream_rr_peer_t   *current;
  153.     uintptr_t                       *tried;
  154.     uintptr_t                        data;
  155. } ngx_stream_upstream_rr_peer_data_t;


  156. ngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
  157.     ngx_stream_upstream_srv_conf_t *us);
  158. ngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,
  159.     ngx_stream_upstream_srv_conf_t *us);
  160. ngx_int_t ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s,
  161.     ngx_stream_upstream_resolved_t *ur);
  162. ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
  163.     void *data);
  164. void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
  165.     void *data, ngx_uint_t state);


  166. #endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */