ngx_http_upstream_round_robin.h revision e18a033b
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8#ifndef _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
9#define _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
10
11
12#include <ngx_config.h>
13#include <ngx_core.h>
14#include <ngx_http.h>
15
16
17typedef struct ngx_http_upstream_rr_peer_s   ngx_http_upstream_rr_peer_t;
18
19struct ngx_http_upstream_rr_peer_s {
20    struct sockaddr                *sockaddr;
21    socklen_t                       socklen;
22    ngx_str_t                       name;
23    ngx_str_t                       server;
24
25    ngx_int_t                       current_weight;
26    ngx_int_t                       effective_weight;
27    ngx_int_t                       weight;
28
29    ngx_uint_t                      conns;
30    ngx_uint_t                      max_conns;
31
32    ngx_uint_t                      fails;
33    time_t                          accessed;
34    time_t                          checked;
35
36    ngx_uint_t                      max_fails;
37    time_t                          fail_timeout;
38    ngx_msec_t                      slow_start;
39    ngx_msec_t                      start_time;
40
41    ngx_uint_t                      down;
42
43#if (NGX_HTTP_SSL || NGX_COMPAT)
44    void                           *ssl_session;
45    int                             ssl_session_len;
46#endif
47
48#if (NGX_HTTP_UPSTREAM_ZONE)
49    ngx_atomic_t                    lock;
50#endif
51
52    ngx_http_upstream_rr_peer_t    *next;
53
54    NGX_COMPAT_BEGIN(32)
55    NGX_COMPAT_END
56};
57
58
59typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;
60
61struct ngx_http_upstream_rr_peers_s {
62    ngx_uint_t                      number;
63
64#if (NGX_HTTP_UPSTREAM_ZONE)
65    ngx_slab_pool_t                *shpool;
66    ngx_atomic_t                    rwlock;
67    ngx_http_upstream_rr_peers_t   *zone_next;
68#endif
69
70    ngx_uint_t                      total_weight;
71
72    unsigned                        single:1;
73    unsigned                        weighted:1;
74
75    ngx_str_t                      *name;
76
77    ngx_http_upstream_rr_peers_t   *next;
78
79    ngx_http_upstream_rr_peer_t    *peer;
80};
81
82
83#if (NGX_HTTP_UPSTREAM_ZONE)
84
85#define ngx_http_upstream_rr_peers_rlock(peers)                               \
86                                                                              \
87    if (peers->shpool) {                                                      \
88        ngx_rwlock_rlock(&peers->rwlock);                                     \
89    }
90
91#define ngx_http_upstream_rr_peers_wlock(peers)                               \
92                                                                              \
93    if (peers->shpool) {                                                      \
94        ngx_rwlock_wlock(&peers->rwlock);                                     \
95    }
96
97#define ngx_http_upstream_rr_peers_unlock(peers)                              \
98                                                                              \
99    if (peers->shpool) {                                                      \
100        ngx_rwlock_unlock(&peers->rwlock);                                    \
101    }
102
103
104#define ngx_http_upstream_rr_peer_lock(peers, peer)                           \
105                                                                              \
106    if (peers->shpool) {                                                      \
107        ngx_rwlock_wlock(&peer->lock);                                        \
108    }
109
110#define ngx_http_upstream_rr_peer_unlock(peers, peer)                         \
111                                                                              \
112    if (peers->shpool) {                                                      \
113        ngx_rwlock_unlock(&peer->lock);                                       \
114    }
115
116#else
117
118#define ngx_http_upstream_rr_peers_rlock(peers)
119#define ngx_http_upstream_rr_peers_wlock(peers)
120#define ngx_http_upstream_rr_peers_unlock(peers)
121#define ngx_http_upstream_rr_peer_lock(peers, peer)
122#define ngx_http_upstream_rr_peer_unlock(peers, peer)
123
124#endif
125
126
127typedef struct {
128    ngx_uint_t                      config;
129    ngx_http_upstream_rr_peers_t   *peers;
130    ngx_http_upstream_rr_peer_t    *current;
131    uintptr_t                      *tried;
132    uintptr_t                       data;
133} ngx_http_upstream_rr_peer_data_t;
134
135
136ngx_int_t ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
137    ngx_http_upstream_srv_conf_t *us);
138ngx_int_t ngx_http_upstream_init_round_robin_peer(ngx_http_request_t *r,
139    ngx_http_upstream_srv_conf_t *us);
140ngx_int_t ngx_http_upstream_create_round_robin_peer(ngx_http_request_t *r,
141    ngx_http_upstream_resolved_t *ur);
142ngx_int_t ngx_http_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
143    void *data);
144void ngx_http_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
145    void *data, ngx_uint_t state);
146
147#if (NGX_HTTP_SSL)
148ngx_int_t
149    ngx_http_upstream_set_round_robin_peer_session(ngx_peer_connection_t *pc,
150    void *data);
151void ngx_http_upstream_save_round_robin_peer_session(ngx_peer_connection_t *pc,
152    void *data);
153#endif
154
155
156#endif /* _NGX_HTTP_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */
157