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