summaryrefslogtreecommitdiffhomepage
path: root/src/http/modules/ngx_http_upstream_ip_hash_module.c
diff options
context:
space:
mode:
authorRuslan Ermilov <ru@nginx.com>2015-04-10 14:48:36 +0300
committerRuslan Ermilov <ru@nginx.com>2015-04-10 14:48:36 +0300
commit4d53631022f4c01878310298a9508cc7ee073012 (patch)
treeae81bb342b2a026e17a4780324ec675c31b1489b /src/http/modules/ngx_http_upstream_ip_hash_module.c
parent18fa775b1060a663e15473161c795992926e60e1 (diff)
downloadnginx-4d53631022f4c01878310298a9508cc7ee073012.tar.gz
nginx-4d53631022f4c01878310298a9508cc7ee073012.tar.bz2
Upstream: store peers as a linked list.
This is an API change.
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.c16
1 files changed, 11 insertions, 5 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 638e0778b..2c6506d6f 100644
--- a/src/http/modules/ngx_http_upstream_ip_hash_module.c
+++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c
@@ -181,11 +181,19 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
if (!iphp->rrp.peers->weighted) {
p = hash % iphp->rrp.peers->number;
+ peer = iphp->rrp.peers->peer;
+ for (i = 0; i < p; i++) {
+ peer = peer->next;
+ }
+
} else {
w = hash % iphp->rrp.peers->total_weight;
- for (i = 0; i < iphp->rrp.peers->number; i++) {
- w -= iphp->rrp.peers->peer[i].weight;
+ for (peer = iphp->rrp.peers->peer, i = 0;
+ peer;
+ peer = peer->next, i++)
+ {
+ w -= peer->weight;
if (w < 0) {
break;
}
@@ -204,8 +212,6 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, pc->log, 0,
"get ip hash peer, hash: %ui %04XA", p, m);
- peer = &iphp->rrp.peers->peer[p];
-
/* ngx_lock_mutex(iphp->rrp.peers->mutex); */
if (peer->down) {
@@ -236,7 +242,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
}
}
- iphp->rrp.current = p;
+ iphp->rrp.current = peer;
pc->sockaddr = peer->sockaddr;
pc->socklen = peer->socklen;