summaryrefslogtreecommitdiffhomepage
path: root/src/os/unix/ngx_files.c
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/os/unix/ngx_files.c
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/os/unix/ngx_files.c')
0 files changed, 0 insertions, 0 deletions