comparison src/stream/ngx_stream_upstream_round_robin.h @ 6115:61d7ae76647d

Stream: port from NGINX+.
author Ruslan Ermilov <ru@nginx.com>
date Mon, 20 Apr 2015 13:05:11 +0300
parents
children 311d232ad803
comparison
equal deleted inserted replaced
6114:4a640716f4e2 6115:61d7ae76647d
1
2 /*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8 #ifndef _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
9 #define _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_
10
11
12 #include <ngx_config.h>
13 #include <ngx_core.h>
14 #include <ngx_stream.h>
15
16
17 typedef struct ngx_stream_upstream_rr_peer_s ngx_stream_upstream_rr_peer_t;
18
19 struct ngx_stream_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
31 ngx_uint_t fails;
32 time_t accessed;
33 time_t checked;
34
35 ngx_uint_t max_fails;
36 time_t fail_timeout;
37
38 ngx_uint_t down; /* unsigned down:1; */
39
40 #if (NGX_STREAM_SSL)
41 void *ssl_session;
42 int ssl_session_len;
43 #endif
44
45 ngx_stream_upstream_rr_peer_t *next;
46
47 #if (NGX_STREAM_UPSTREAM_ZONE)
48 ngx_atomic_t lock;
49 #endif
50 };
51
52
53 typedef struct ngx_stream_upstream_rr_peers_s ngx_stream_upstream_rr_peers_t;
54
55 struct ngx_stream_upstream_rr_peers_s {
56 ngx_uint_t number;
57
58 #if (NGX_STREAM_UPSTREAM_ZONE)
59 ngx_slab_pool_t *shpool;
60 ngx_atomic_t rwlock;
61 #endif
62
63 ngx_uint_t total_weight;
64
65 unsigned single:1;
66 unsigned weighted:1;
67
68 ngx_str_t *name;
69
70 ngx_stream_upstream_rr_peers_t *next;
71
72 ngx_stream_upstream_rr_peer_t *peer;
73 };
74
75
76 #if (NGX_STREAM_UPSTREAM_ZONE)
77
78 #define ngx_stream_upstream_rr_peers_rlock(peers) \
79 \
80 if (peers->shpool) { \
81 ngx_rwlock_rlock(&peers->rwlock); \
82 }
83
84 #define ngx_stream_upstream_rr_peers_wlock(peers) \
85 \
86 if (peers->shpool) { \
87 ngx_rwlock_wlock(&peers->rwlock); \
88 }
89
90 #define ngx_stream_upstream_rr_peers_unlock(peers) \
91 \
92 if (peers->shpool) { \
93 ngx_rwlock_unlock(&peers->rwlock); \
94 }
95
96
97 #define ngx_stream_upstream_rr_peer_lock(peers, peer) \
98 \
99 if (peers->shpool) { \
100 ngx_rwlock_wlock(&peer->lock); \
101 }
102
103 #define ngx_stream_upstream_rr_peer_unlock(peers, peer) \
104 \
105 if (peers->shpool) { \
106 ngx_rwlock_unlock(&peer->lock); \
107 }
108
109 #else
110
111 #define ngx_stream_upstream_rr_peers_rlock(peers)
112 #define ngx_stream_upstream_rr_peers_wlock(peers)
113 #define ngx_stream_upstream_rr_peers_unlock(peers)
114 #define ngx_stream_upstream_rr_peer_lock(peers, peer)
115 #define ngx_stream_upstream_rr_peer_unlock(peers, peer)
116
117 #endif
118
119
120 typedef struct {
121 ngx_stream_upstream_rr_peers_t *peers;
122 ngx_stream_upstream_rr_peer_t *current;
123 uintptr_t *tried;
124 uintptr_t data;
125 } ngx_stream_upstream_rr_peer_data_t;
126
127
128 ngx_int_t ngx_stream_upstream_init_round_robin(ngx_conf_t *cf,
129 ngx_stream_upstream_srv_conf_t *us);
130 ngx_int_t ngx_stream_upstream_init_round_robin_peer(ngx_stream_session_t *s,
131 ngx_stream_upstream_srv_conf_t *us);
132 ngx_int_t ngx_stream_upstream_get_round_robin_peer(ngx_peer_connection_t *pc,
133 void *data);
134 void ngx_stream_upstream_free_round_robin_peer(ngx_peer_connection_t *pc,
135 void *data, ngx_uint_t state);
136
137
138 #endif /* _NGX_STREAM_UPSTREAM_ROUND_ROBIN_H_INCLUDED_ */