Mercurial > hg > nginx
comparison src/http/modules/ngx_http_upstream_hash_module.c @ 6100:c44459611d91
Upstream: store peers as a linked list.
This is an API change.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Fri, 10 Apr 2015 14:48:36 +0300 |
parents | 6ff0ebd6fbf4 |
children | 3264b7828f72 |
comparison
equal
deleted
inserted
replaced
6099:6ff0ebd6fbf4 | 6100:c44459611d91 |
---|---|
209 hp->rehash++; | 209 hp->rehash++; |
210 | 210 |
211 if (!hp->rrp.peers->weighted) { | 211 if (!hp->rrp.peers->weighted) { |
212 p = hp->hash % hp->rrp.peers->number; | 212 p = hp->hash % hp->rrp.peers->number; |
213 | 213 |
214 peer = hp->rrp.peers->peer; | |
215 for (i = 0; i < p; i++) { | |
216 peer = peer->next; | |
217 } | |
218 | |
214 } else { | 219 } else { |
215 w = hp->hash % hp->rrp.peers->total_weight; | 220 w = hp->hash % hp->rrp.peers->total_weight; |
216 | 221 |
217 for (i = 0; i < hp->rrp.peers->number; i++) { | 222 for (peer = hp->rrp.peers->peer, i = 0; |
218 w -= hp->rrp.peers->peer[i].weight; | 223 peer; |
224 peer = peer->next, i++) | |
225 { | |
226 w -= peer->weight; | |
219 if (w < 0) { | 227 if (w < 0) { |
220 break; | 228 break; |
221 } | 229 } |
222 } | 230 } |
223 | 231 |
231 goto next; | 239 goto next; |
232 } | 240 } |
233 | 241 |
234 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 242 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
235 "get hash peer, value:%uD, peer:%ui", hp->hash, p); | 243 "get hash peer, value:%uD, peer:%ui", hp->hash, p); |
236 | |
237 peer = &hp->rrp.peers->peer[p]; | |
238 | 244 |
239 if (peer->down) { | 245 if (peer->down) { |
240 goto next; | 246 goto next; |
241 } | 247 } |
242 | 248 |
254 if (++hp->tries > 20) { | 260 if (++hp->tries > 20) { |
255 return hp->get_rr_peer(pc, &hp->rrp); | 261 return hp->get_rr_peer(pc, &hp->rrp); |
256 } | 262 } |
257 } | 263 } |
258 | 264 |
259 hp->rrp.current = p; | 265 hp->rrp.current = peer; |
260 | 266 |
261 pc->sockaddr = peer->sockaddr; | 267 pc->sockaddr = peer->sockaddr; |
262 pc->socklen = peer->socklen; | 268 pc->socklen = peer->socklen; |
263 pc->name = &peer->name; | 269 pc->name = &peer->name; |
264 | 270 |
304 return NGX_ERROR; | 310 return NGX_ERROR; |
305 } | 311 } |
306 | 312 |
307 points->number = 0; | 313 points->number = 0; |
308 | 314 |
309 for (i = 0; i < peers->number; i++) { | 315 for (peer = peers->peer; peer; peer = peer->next) { |
310 peer = &peers->peer[i]; | |
311 server = &peer->server; | 316 server = &peer->server; |
312 | 317 |
313 /* | 318 /* |
314 * Hash expression is compatible with Cache::Memcached::Fast: | 319 * Hash expression is compatible with Cache::Memcached::Fast: |
315 * crc32(HOST \0 PORT PREV_HASH). | 320 * crc32(HOST \0 PORT PREV_HASH). |
473 | 478 |
474 time_t now; | 479 time_t now; |
475 intptr_t m; | 480 intptr_t m; |
476 ngx_str_t *server; | 481 ngx_str_t *server; |
477 ngx_int_t total; | 482 ngx_int_t total; |
478 ngx_uint_t i, n; | 483 ngx_uint_t i, n, best_i; |
479 ngx_http_upstream_rr_peer_t *peer, *best; | 484 ngx_http_upstream_rr_peer_t *peer, *best; |
480 ngx_http_upstream_chash_point_t *point; | 485 ngx_http_upstream_chash_point_t *point; |
481 ngx_http_upstream_chash_points_t *points; | 486 ngx_http_upstream_chash_points_t *points; |
482 ngx_http_upstream_hash_srv_conf_t *hcf; | 487 ngx_http_upstream_hash_srv_conf_t *hcf; |
483 | 488 |
499 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, | 504 ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, |
500 "consistent hash peer:%uD, server:\"%V\"", | 505 "consistent hash peer:%uD, server:\"%V\"", |
501 hp->hash, server); | 506 hp->hash, server); |
502 | 507 |
503 best = NULL; | 508 best = NULL; |
509 best_i = 0; | |
504 total = 0; | 510 total = 0; |
505 | 511 |
506 for (i = 0; i < hp->rrp.peers->number; i++) { | 512 for (peer = hp->rrp.peers->peer, i = 0; |
513 peer; | |
514 peer = peer->next, i++) | |
515 { | |
507 | 516 |
508 n = i / (8 * sizeof(uintptr_t)); | 517 n = i / (8 * sizeof(uintptr_t)); |
509 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); | 518 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); |
510 | 519 |
511 if (hp->rrp.tried[n] & m) { | 520 if (hp->rrp.tried[n] & m) { |
512 continue; | 521 continue; |
513 } | 522 } |
514 | |
515 peer = &hp->rrp.peers->peer[i]; | |
516 | 523 |
517 if (peer->down) { | 524 if (peer->down) { |
518 continue; | 525 continue; |
519 } | 526 } |
520 | 527 |
539 peer->effective_weight++; | 546 peer->effective_weight++; |
540 } | 547 } |
541 | 548 |
542 if (best == NULL || peer->current_weight > best->current_weight) { | 549 if (best == NULL || peer->current_weight > best->current_weight) { |
543 best = peer; | 550 best = peer; |
551 best_i = i; | |
544 } | 552 } |
545 } | 553 } |
546 | 554 |
547 if (best) { | 555 if (best) { |
548 best->current_weight -= total; | 556 best->current_weight -= total; |
549 | 557 goto found; |
550 i = best - &hp->rrp.peers->peer[0]; | |
551 | |
552 hp->rrp.current = i; | |
553 | |
554 n = i / (8 * sizeof(uintptr_t)); | |
555 m = (uintptr_t) 1 << i % (8 * sizeof(uintptr_t)); | |
556 | |
557 hp->rrp.tried[n] |= m; | |
558 | |
559 if (now - best->checked > best->fail_timeout) { | |
560 best->checked = now; | |
561 } | |
562 | |
563 pc->sockaddr = best->sockaddr; | |
564 pc->socklen = best->socklen; | |
565 pc->name = &best->name; | |
566 | |
567 best->conns++; | |
568 | |
569 return NGX_OK; | |
570 } | 558 } |
571 | 559 |
572 hp->hash++; | 560 hp->hash++; |
573 hp->tries++; | 561 hp->tries++; |
574 | 562 |
575 if (hp->tries >= points->number) { | 563 if (hp->tries >= points->number) { |
576 return NGX_BUSY; | 564 return NGX_BUSY; |
577 } | 565 } |
578 } | 566 } |
567 | |
568 found: | |
569 | |
570 hp->rrp.current = best; | |
571 | |
572 pc->sockaddr = best->sockaddr; | |
573 pc->socklen = best->socklen; | |
574 pc->name = &best->name; | |
575 | |
576 best->conns++; | |
577 | |
578 if (now - best->checked > best->fail_timeout) { | |
579 best->checked = now; | |
580 } | |
581 | |
582 n = best_i / (8 * sizeof(uintptr_t)); | |
583 m = (uintptr_t) 1 << best_i % (8 * sizeof(uintptr_t)); | |
584 | |
585 hp->rrp.tried[n] |= m; | |
586 | |
587 return NGX_OK; | |
579 } | 588 } |
580 | 589 |
581 | 590 |
582 static void * | 591 static void * |
583 ngx_http_upstream_hash_create_conf(ngx_conf_t *cf) | 592 ngx_http_upstream_hash_create_conf(ngx_conf_t *cf) |