summaryrefslogtreecommitdiffhomepage
path: root/src/http/ngx_http_upstream_round_robin.h
diff options
context:
space:
mode:
authorMaxim Dounin <mdounin@mdounin.ru>2012-05-14 09:57:20 +0000
committerMaxim Dounin <mdounin@mdounin.ru>2012-05-14 09:57:20 +0000
commit52327e0627f49dbda1e8db695e63a4b0af4448b1 (patch)
tree0b549b55a9f7ca29b2949cb7b3ef90a2733a0fef /src/http/ngx_http_upstream_round_robin.h
parente302ed6fc3ea48f2ccb5bc410d6306522d4f7497 (diff)
downloadnginx-52327e0627f49dbda1e8db695e63a4b0af4448b1.tar.gz
nginx-52327e0627f49dbda1e8db695e63a4b0af4448b1.tar.bz2
Upstream: smooth weighted round-robin balancing.
For edge case weights like { 5, 1, 1 } we now produce { a, a, b, a, c, a, a } sequence instead of { c, b, a, a, a, a, a } produced previously. Algorithm is as follows: on each peer selection we increase current_weight of each eligible peer by its weight, select peer with greatest current_weight and reduce its current_weight by total number of weight points distributed among peers. In case of { 5, 1, 1 } weights this gives the following sequence of current_weight's: a b c 0 0 0 (initial state) 5 1 1 (a selected) -2 1 1 3 2 2 (a selected) -4 2 2 1 3 3 (b selected) 1 -4 3 6 -3 4 (a selected) -1 -3 4 4 -2 5 (c selected) 4 -2 -2 9 -1 -1 (a selected) 2 -1 -1 7 0 0 (a selected) 0 0 0 To preserve weight reduction in case of failures the effective_weight variable was introduced, which usually matches peer's weight, but is reduced temporarily on peer failures. This change also fixes loop with backup servers and proxy_next_upstream http_404 (ticket #47), and skipping alive upstreams in some cases if there are multiple dead ones (ticket #64).
Diffstat (limited to 'src/http/ngx_http_upstream_round_robin.h')
-rw-r--r--src/http/ngx_http_upstream_round_robin.h1
1 files changed, 1 insertions, 0 deletions
diff --git a/src/http/ngx_http_upstream_round_robin.h b/src/http/ngx_http_upstream_round_robin.h
index 4b70f2f5b..4de3caea1 100644
--- a/src/http/ngx_http_upstream_round_robin.h
+++ b/src/http/ngx_http_upstream_round_robin.h
@@ -20,6 +20,7 @@ typedef struct {
ngx_str_t name;
ngx_int_t current_weight;
+ ngx_int_t effective_weight;
ngx_int_t weight;
ngx_uint_t fails;