Mercurial > hg > nginx
comparison src/stream/ngx_stream_upstream_hash_module.c @ 6121:b6047abf5f30
Upstream: simplified ip_hash and hash peer selection code.
Now that peers are stored as a list, the weighted and unweighted
cases became nearly identical.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Tue, 21 Apr 2015 19:09:04 +0300 |
parents | 61d7ae76647d |
children | bf8b6534db3a |
comparison
equal
deleted
inserted
replaced
6118:1bdfceda86a9 | 6121:b6047abf5f30 |
---|---|
162 u_char buf[NGX_INT_T_LEN]; | 162 u_char buf[NGX_INT_T_LEN]; |
163 size_t size; | 163 size_t size; |
164 uint32_t hash; | 164 uint32_t hash; |
165 ngx_int_t w; | 165 ngx_int_t w; |
166 uintptr_t m; | 166 uintptr_t m; |
167 ngx_uint_t i, n, p; | 167 ngx_uint_t n, p; |
168 ngx_stream_upstream_rr_peer_t *peer; | 168 ngx_stream_upstream_rr_peer_t *peer; |
169 | 169 |
170 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, | 170 ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, |
171 "get hash peer, try: %ui", pc->tries); | 171 "get hash peer, try: %ui", pc->tries); |
172 | 172 |
202 hash = (hash >> 16) & 0x7fff; | 202 hash = (hash >> 16) & 0x7fff; |
203 | 203 |
204 hp->hash += hash; | 204 hp->hash += hash; |
205 hp->rehash++; | 205 hp->rehash++; |
206 | 206 |
207 if (!hp->rrp.peers->weighted) { | 207 w = hp->hash % hp->rrp.peers->total_weight; |
208 p = hp->hash % hp->rrp.peers->number; | 208 peer = hp->rrp.peers->peer; |
209 | 209 p = 0; |
210 peer = hp->rrp.peers->peer; | 210 |
211 for (i = 0; i < p; i++) { | 211 while (w >= peer->weight) { |
212 peer = peer->next; | 212 w -= peer->weight; |
213 } | 213 peer = peer->next; |
214 | 214 p++; |
215 } else { | |
216 w = hp->hash % hp->rrp.peers->total_weight; | |
217 | |
218 for (peer = hp->rrp.peers->peer, i = 0; | |
219 peer; | |
220 peer = peer->next, i++) | |
221 { | |
222 w -= peer->weight; | |
223 if (w < 0) { | |
224 break; | |
225 } | |
226 } | |
227 | |
228 p = i; | |
229 } | 215 } |
230 | 216 |
231 n = p / (8 * sizeof(uintptr_t)); | 217 n = p / (8 * sizeof(uintptr_t)); |
232 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); | 218 m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t)); |
233 | 219 |