]> git.kaiwu.me - nginx.git/commit
Upstream: smooth weighted round-robin balancing.
authorMaxim Dounin <mdounin@mdounin.ru>
Mon, 14 May 2012 09:57:20 +0000 (09:57 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Mon, 14 May 2012 09:57:20 +0000 (09:57 +0000)
commit52327e0627f49dbda1e8db695e63a4b0af4448b1
tree0b549b55a9f7ca29b2949cb7b3ef90a2733a0fef
parente302ed6fc3ea48f2ccb5bc410d6306522d4f7497
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).
src/http/ngx_http_upstream_round_robin.c
src/http/ngx_http_upstream_round_robin.h