aboutsummaryrefslogtreecommitdiff
path: root/src/http/modules/ngx_http_upstream_ip_hash_module.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/http/modules/ngx_http_upstream_ip_hash_module.c')
-rw-r--r--src/http/modules/ngx_http_upstream_ip_hash_module.c12
1 files changed, 11 insertions, 1 deletions
diff --git a/src/http/modules/ngx_http_upstream_ip_hash_module.c b/src/http/modules/ngx_http_upstream_ip_hash_module.c
index 1fa01d95a..1c1b41d19 100644
--- a/src/http/modules/ngx_http_upstream_ip_hash_module.c
+++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c
@@ -163,11 +163,19 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
ngx_http_upstream_rr_peers_rlock(iphp->rrp.peers);
- if (iphp->tries > 20 || iphp->rrp.peers->single) {
+ if (iphp->tries > 20 || iphp->rrp.peers->number < 2) {
ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
return iphp->get_rr_peer(pc, &iphp->rrp);
}
+#if (NGX_HTTP_UPSTREAM_ZONE)
+ if (iphp->rrp.peers->config && iphp->rrp.config != *iphp->rrp.peers->config)
+ {
+ ngx_http_upstream_rr_peers_unlock(iphp->rrp.peers);
+ return iphp->get_rr_peer(pc, &iphp->rrp);
+ }
+#endif
+
now = ngx_time();
pc->cached = 0;
@@ -232,6 +240,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
}
iphp->rrp.current = peer;
+ ngx_http_upstream_rr_peer_ref(iphp->rrp.peers, peer);
pc->sockaddr = peer->sockaddr;
pc->socklen = peer->socklen;
@@ -268,6 +277,7 @@ ngx_http_upstream_ip_hash(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)
uscf->peer.init_upstream = ngx_http_upstream_init_ip_hash;
uscf->flags = NGX_HTTP_UPSTREAM_CREATE
+ |NGX_HTTP_UPSTREAM_MODIFY
|NGX_HTTP_UPSTREAM_WEIGHT
|NGX_HTTP_UPSTREAM_MAX_CONNS
|NGX_HTTP_UPSTREAM_MAX_FAILS