comparison src/http/ngx_http_upstream_round_robin.c @ 5831:575175ebf4b4

Upstream: included backup peers into peer.tries. Since peer.tries is never reset it can now be limited if required.
author Roman Arutyunyan <arut@nginx.com>
date Fri, 12 Sep 2014 18:50:46 +0400
parents 5b7276408565
children 6ff0ebd6fbf4
comparison
equal deleted inserted replaced
5830:3e5b630e0ec9 5831:575175ebf4b4
6 6
7 7
8 #include <ngx_config.h> 8 #include <ngx_config.h>
9 #include <ngx_core.h> 9 #include <ngx_core.h>
10 #include <ngx_http.h> 10 #include <ngx_http.h>
11
12
13 #define ngx_http_upstream_tries(p) ((p)->number \
14 + ((p)->next ? (p)->next->number : 0))
11 15
12 16
13 static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer( 17 static ngx_http_upstream_rr_peer_t *ngx_http_upstream_get_peer(
14 ngx_http_upstream_rr_peer_data_t *rrp); 18 ngx_http_upstream_rr_peer_data_t *rrp);
15 19
253 } 257 }
254 } 258 }
255 259
256 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; 260 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
257 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; 261 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
258 r->upstream->peer.tries = rrp->peers->number; 262 r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);
259 #if (NGX_HTTP_SSL) 263 #if (NGX_HTTP_SSL)
260 r->upstream->peer.set_session = 264 r->upstream->peer.set_session =
261 ngx_http_upstream_set_round_robin_peer_session; 265 ngx_http_upstream_set_round_robin_peer_session;
262 r->upstream->peer.save_session = 266 r->upstream->peer.save_session =
263 ngx_http_upstream_save_round_robin_peer_session; 267 ngx_http_upstream_save_round_robin_peer_session;
372 } 376 }
373 } 377 }
374 378
375 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer; 379 r->upstream->peer.get = ngx_http_upstream_get_round_robin_peer;
376 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer; 380 r->upstream->peer.free = ngx_http_upstream_free_round_robin_peer;
377 r->upstream->peer.tries = rrp->peers->number; 381 r->upstream->peer.tries = ngx_http_upstream_tries(rrp->peers);
378 #if (NGX_HTTP_SSL) 382 #if (NGX_HTTP_SSL)
379 r->upstream->peer.set_session = ngx_http_upstream_empty_set_session; 383 r->upstream->peer.set_session = ngx_http_upstream_empty_set_session;
380 r->upstream->peer.save_session = ngx_http_upstream_empty_save_session; 384 r->upstream->peer.save_session = ngx_http_upstream_empty_save_session;
381 #endif 385 #endif
382 386
430 pc->socklen = peer->socklen; 434 pc->socklen = peer->socklen;
431 pc->name = &peer->name; 435 pc->name = &peer->name;
432 436
433 /* ngx_unlock_mutex(peers->mutex); */ 437 /* ngx_unlock_mutex(peers->mutex); */
434 438
435 if (pc->tries == 1 && peers->next) {
436 pc->tries += peers->next->number;
437 }
438
439 return NGX_OK; 439 return NGX_OK;
440 440
441 failed: 441 failed:
442 442
443 if (peers->next) { 443 if (peers->next) {
445 /* ngx_unlock_mutex(peers->mutex); */ 445 /* ngx_unlock_mutex(peers->mutex); */
446 446
447 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers"); 447 ngx_log_debug0(NGX_LOG_DEBUG_HTTP, pc->log, 0, "backup servers");
448 448
449 rrp->peers = peers->next; 449 rrp->peers = peers->next;
450 pc->tries = rrp->peers->number;
451 450
452 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1)) 451 n = (rrp->peers->number + (8 * sizeof(uintptr_t) - 1))
453 / (8 * sizeof(uintptr_t)); 452 / (8 * sizeof(uintptr_t));
454 453
455 for (i = 0; i < n; i++) { 454 for (i = 0; i < n; i++) {