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