mirror of
https://github.com/nginx/nginx.git
synced 2025-06-28 02:02:50 +08:00
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:
parent
3a2ca34548
commit
a10ec2db91
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user