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_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
9e18a033bSKonstantin Ananyev#define _NGX_STREAM_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_stream.h>
15e18a033bSKonstantin Ananyev
16e18a033bSKonstantin Ananyev
17e18a033bSKonstantin Ananyevtypedef struct ngx_stream_upstream_rr_peer_s   ngx_stream_upstream_rr_peer_t;
18e18a033bSKonstantin Ananyev
19e18a033bSKonstantin Ananyevstruct ngx_stream_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    void                            *ssl_session;
44e18a033bSKonstantin Ananyev    int                              ssl_session_len;
45e18a033bSKonstantin Ananyev
46e18a033bSKonstantin Ananyev#if (NGX_STREAM_UPSTREAM_ZONE)
47e18a033bSKonstantin Ananyev    ngx_atomic_t                     lock;
48e18a033bSKonstantin Ananyev#endif
49e18a033bSKonstantin Ananyev
50e18a033bSKonstantin Ananyev    ngx_stream_upstream_rr_peer_t   *next;
51e18a033bSKonstantin Ananyev
52e18a033bSKonstantin Ananyev    NGX_COMPAT_BEGIN(25)
53e18a033bSKonstantin Ananyev    NGX_COMPAT_END
54e18a033bSKonstantin Ananyev};
55e18a033bSKonstantin Ananyev
56e18a033bSKonstantin Ananyev
57e18a033bSKonstantin Ananyevtypedef struct ngx_stream_upstream_rr_peers_s  ngx_stream_upstream_rr_peers_t;
58e18a033bSKonstantin Ananyev
59e18a033bSKonstantin Ananyevstruct ngx_stream_upstream_rr_peers_s {
60e18a033bSKonstantin Ananyev    ngx_uint_t                       number;
61e18a033bSKonstantin Ananyev
62e18a033bSKonstantin Ananyev#if (NGX_STREAM_UPSTREAM_ZONE)
63e18a033bSKonstantin Ananyev    ngx_slab_pool_t                 *shpool;
64e18a033bSKonstantin Ananyev    ngx_atomic_t                     rwlock;
65e18a033bSKonstantin Ananyev    ngx_stream_upstream_rr_peers_t  *zone_next;
66e18a033bSKonstantin Ananyev#endif
67e18a033bSKonstantin Ananyev
68e18a033bSKonstantin Ananyev    ngx_uint_t                       total_weight;
69e18a033bSKonstantin Ananyev
70e18a033bSKonstantin Ananyev    unsigned                         single:1;
71e18a033bSKonstantin Ananyev    unsigned                         weighted:1;
72e18a033bSKonstantin Ananyev
73e18a033bSKonstantin Ananyev    ngx_str_t                       *name;
74e18a033bSKonstantin Ananyev
75e18a033bSKonstantin Ananyev    ngx_stream_upstream_rr_peers_t  *next;
76e18a033bSKonstantin Ananyev
77e18a033bSKonstantin Ananyev    ngx_stream_upstream_rr_peer_t   *peer;
78e18a033bSKonstantin Ananyev};
79e18a033bSKonstantin Ananyev
80e18a033bSKonstantin Ananyev
81e18a033bSKonstantin Ananyev#if (NGX_STREAM_UPSTREAM_ZONE)
82e18a033bSKonstantin Ananyev
83e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peers_rlock(peers)                             \
84e18a033bSKonstantin Ananyev                                                                              \
85e18a033bSKonstantin Ananyev    if (peers->shpool) {                                                      \
86e18a033bSKonstantin Ananyev        ngx_rwlock_rlock(&peers->rwlock);                                     \
87e18a033bSKonstantin Ananyev    }
88e18a033bSKonstantin Ananyev
89e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peers_wlock(peers)                             \
90e18a033bSKonstantin Ananyev                                                                              \
91e18a033bSKonstantin Ananyev    if (peers->shpool) {                                                      \
92e18a033bSKonstantin Ananyev        ngx_rwlock_wlock(&peers->rwlock);                                     \
93e18a033bSKonstantin Ananyev    }
94e18a033bSKonstantin Ananyev
95e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peers_unlock(peers)                            \
96e18a033bSKonstantin Ananyev                                                                              \
97e18a033bSKonstantin Ananyev    if (peers->shpool) {                                                      \
98e18a033bSKonstantin Ananyev        ngx_rwlock_unlock(&peers->rwlock);                                    \
99e18a033bSKonstantin Ananyev    }
100e18a033bSKonstantin Ananyev
101e18a033bSKonstantin Ananyev
102e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peer_lock(peers, peer)                         \
103e18a033bSKonstantin Ananyev                                                                              \
104e18a033bSKonstantin Ananyev    if (peers->shpool) {                                                      \
105e18a033bSKonstantin Ananyev        ngx_rwlock_wlock(&peer->lock);                                        \
106e18a033bSKonstantin Ananyev    }
107e18a033bSKonstantin Ananyev
108e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peer_unlock(peers, peer)                       \
109e18a033bSKonstantin Ananyev                                                                              \
110e18a033bSKonstantin Ananyev    if (peers->shpool) {                                                      \
111e18a033bSKonstantin Ananyev        ngx_rwlock_unlock(&peer->lock);                                       \
112e18a033bSKonstantin Ananyev    }
113e18a033bSKonstantin Ananyev
114e18a033bSKonstantin Ananyev#else
115e18a033bSKonstantin Ananyev
116e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peers_rlock(peers)
117e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peers_wlock(peers)
118e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peers_unlock(peers)
119e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peer_lock(peers, peer)
120e18a033bSKonstantin Ananyev#define ngx_stream_upstream_rr_peer_unlock(peers, peer)
121e18a033bSKonstantin Ananyev
122e18a033bSKonstantin Ananyev#endif
123e18a033bSKonstantin Ananyev
124e18a033bSKonstantin Ananyev
125e18a033bSKonstantin Ananyevtypedef struct {
126e18a033bSKonstantin Ananyev    ngx_uint_t                       config;
127e18a033bSKonstantin Ananyev    ngx_stream_upstream_rr_peers_t  *peers;
128e18a033bSKonstantin Ananyev    ngx_stream_upstream_rr_peer_t   *current;
129e18a033bSKonstantin Ananyev    uintptr_t                       *tried;
130e18a033bSKonstantin Ananyev    uintptr_t                        data;
131e18a033bSKonstantin Ananyev} ngx_stream_upstream_rr_peer_data_t;
132e18a033bSKonstantin Ananyev
133e18a033bSKonstantin Ananyev
134e18a033bSKonstantin Ananyevngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
135e18a033bSKonstantin Ananyev    ngx_stream_upstream_srv_conf_t *us);
136e18a033bSKonstantin Ananyevngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,
137e18a033bSKonstantin Ananyev    ngx_stream_upstream_srv_conf_t *us);
138e18a033bSKonstantin Ananyevngx_int_t ngx_stream_upstream_create_round_robin_peer(ngx_stream_session_t *s,
139e18a033bSKonstantin Ananyev    ngx_stream_upstream_resolved_t *ur);
140e18a033bSKonstantin Ananyevngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
141e18a033bSKonstantin Ananyev    void *data);
142e18a033bSKonstantin Ananyevvoid ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
143e18a033bSKonstantin Ananyev    void *data, ngx_uint_t state);
144e18a033bSKonstantin Ananyev
145e18a033bSKonstantin Ananyev
146e18a033bSKonstantin Ananyev#endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */
147