Mercurial > hg > nginx
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++) { |