Upstream hash: limited number of tries in consistent case.

While this may result in non-ideal distribution of requests if nginx
won't be able to select a server in a reasonable number of attempts,
this still looks better than severe performance degradation observed
if there is no limit and there are many points configured (ticket #1030).
This is also in line with what we do for other hash balancing methods.
This commit is contained in:
Maxim Dounin 2017-10-05 17:42:59 +03:00
parent 3a2ca34548
commit a10ec2db91
2 changed files with 14 additions and 6 deletions

View File

@ -503,6 +503,11 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
ngx_http_upstream_rr_peers_wlock(hp->rrp.peers); ngx_http_upstream_rr_peers_wlock(hp->rrp.peers);
if (hp->tries > 20 || hp->rrp.peers->single) {
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
return hp->get_rr_peer(pc, &hp->rrp);
}
pc->cached = 0; pc->cached = 0;
pc->connection = NULL; pc->connection = NULL;
@ -577,10 +582,9 @@ ngx_http_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
hp->hash++; hp->hash++;
hp->tries++; hp->tries++;
if (hp->tries >= points->number) { if (hp->tries > 20) {
pc->name = hp->rrp.peers->name;
ngx_http_upstream_rr_peers_unlock(hp->rrp.peers); ngx_http_upstream_rr_peers_unlock(hp->rrp.peers);
return NGX_BUSY; return hp->get_rr_peer(pc, &hp->rrp);
} }
} }

View File

@ -505,6 +505,11 @@ ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers); ngx_stream_upstream_rr_peers_wlock(hp->rrp.peers);
if (hp->tries > 20 || hp->rrp.peers->single) {
ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);
return hp->get_rr_peer(pc, &hp->rrp);
}
pc->connection = NULL; pc->connection = NULL;
now = ngx_time(); now = ngx_time();
@ -578,10 +583,9 @@ ngx_stream_upstream_get_chash_peer(ngx_peer_connection_t *pc, void *data)
hp->hash++; hp->hash++;
hp->tries++; hp->tries++;
if (hp->tries >= points->number) { if (hp->tries > 20) {
pc->name = hp->rrp.peers->name;
ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers); ngx_stream_upstream_rr_peers_unlock(hp->rrp.peers);
return NGX_BUSY; return hp->get_rr_peer(pc, &hp->rrp);
} }
} }