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)