Mercurial > hg > nginx
diff src/http/modules/ngx_http_upstream_ip_hash_module.c @ 7300:ed599ea6c1f1
Upstream: improved peer selection concurrency for hash and ip_hash.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Thu, 14 Jun 2018 07:03:50 +0300 |
parents | 29bf0dbc0a77 |
children |
line wrap: on
line diff
--- a/src/http/modules/ngx_http_upstream_ip_hash_module.c Wed Jun 13 22:37:49 2018 +0300 +++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c Thu Jun 14 07:03:50 2018 +0300 @@ -161,7 +161,7 @@ /* TODO: cached */ - ngx_http_upstream_rr_peers_wlock(iphp->rrp.peers); + ngx_http_upstream_rr_peers_rlock(iphp->rrp.peers); if (iphp->tries > 20 || iphp->rrp.peers->single) { ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); @@ -201,7 +201,10 @@ ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0, "get ip hash peer, hash: %ui %04XL", p, (uint64_t) m); + ngx_http_upstream_rr_peer_lock(iphp->rrp.peers, peer); + if (peer->down) { + ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); goto next; } @@ -209,10 +212,12 @@ && peer->fails >= peer->max_fails && now - peer->checked <= peer->fail_timeout) { + ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); goto next; } if (peer->max_conns && peer->conns >= peer->max_conns) { + ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); goto next; } @@ -238,6 +243,7 @@ peer->checked = now; } + ngx_http_upstream_rr_peer_unlock(iphp->rrp.peers, peer); ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers); iphp->rrp.tried[n] |= m;