Mercurial > hg > nginx
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_ */ |