Mercurial > hg > nginx
comparison src/http/ngx_http_upstream_round_robin.c @ 4010:74a93d3fdd85
Fixing cpu hog with all upstream servers marked "down".
The following configuration causes nginx to hog cpu due to infinite loop
in ngx_http_upstream_get_peer():
upstream backend {
server 127.0.0.1:8080 down;
server 127.0.0.1:8080 down;
}
server {
...
location / {
proxy_pass http://backend;
}
}
Make sure we don't loop infinitely in ngx_http_upstream_get_peer() but stop
after resetting peer weights once.
Return 0 if we are stuck. This is guaranteed to work as peer 0 always exists,
and eventually ngx_http_upstream_get_round_robin_peer() will do the right
thing falling back to backup servers or returning NGX_BUSY.
author | Maxim Dounin <mdounin@mdounin.ru> |
---|---|
date | Thu, 18 Aug 2011 16:52:38 +0000 |
parents | ff127ba3b091 |
children | 9d4cbb09ae8b |
comparison
equal
deleted
inserted
replaced
4009:3183165283cc | 4010:74a93d3fdd85 |
---|---|
583 | 583 |
584 | 584 |
585 static ngx_uint_t | 585 static ngx_uint_t |
586 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers) | 586 ngx_http_upstream_get_peer(ngx_http_upstream_rr_peers_t *peers) |
587 { | 587 { |
588 ngx_uint_t i, n; | 588 ngx_uint_t i, n, reset = 0; |
589 ngx_http_upstream_rr_peer_t *peer; | 589 ngx_http_upstream_rr_peer_t *peer; |
590 | 590 |
591 peer = &peers->peer[0]; | 591 peer = &peers->peer[0]; |
592 | 592 |
593 for ( ;; ) { | 593 for ( ;; ) { |
622 } | 622 } |
623 | 623 |
624 return n; | 624 return n; |
625 } | 625 } |
626 | 626 |
627 if (reset++) { | |
628 return 0; | |
629 } | |
630 | |
627 for (i = 0; i < peers->number; i++) { | 631 for (i = 0; i < peers->number; i++) { |
628 peer[i].current_weight = peer[i].weight; | 632 peer[i].current_weight = peer[i].weight; |
629 } | 633 } |
630 } | 634 } |
631 } | 635 } |