# HG changeset patch # User Ruslan Ermilov # Date 1429632544 -10800 # Node ID b6047abf5f305fee4709c5004a354fed738f9167 # Parent 1bdfceda86a99a4dc99934181d2f9e2632003ca8 Upstream: simplified ip_hash and hash peer selection code. Now that peers are stored as a list, the weighted and unweighted cases became nearly identical. diff --git a/src/http/modules/ngx_http_upstream_hash_module.c b/src/http/modules/ngx_http_upstream_hash_module.c --- a/src/http/modules/ngx_http_upstream_hash_module.c +++ b/src/http/modules/ngx_http_upstream_hash_module.c @@ -170,7 +170,7 @@ ngx_http_upstream_get_hash_peer(ngx_peer uint32_t hash; ngx_int_t w; uintptr_t m; - ngx_uint_t i, n, p; + ngx_uint_t n, p; ngx_http_upstream_rr_peer_t *peer; ngx_log_debug1(NGX_LOG_DEBUG_HTTP, pc->log, 0, @@ -211,28 +211,14 @@ ngx_http_upstream_get_hash_peer(ngx_peer hp->hash += hash; hp->rehash++; - if (!hp->rrp.peers->weighted) { - p = hp->hash % hp->rrp.peers->number; - - peer = hp->rrp.peers->peer; - for (i = 0; i < p; i++) { - peer = peer->next; - } - - } else { - w = hp->hash % hp->rrp.peers->total_weight; + w = hp->hash % hp->rrp.peers->total_weight; + peer = hp->rrp.peers->peer; + p = 0; - for (peer = hp->rrp.peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - w -= peer->weight; - if (w < 0) { - break; - } - } - - p = i; + while (w >= peer->weight) { + w -= peer->weight; + peer = peer->next; + p++; } n = p / (8 * sizeof(uintptr_t)); diff --git a/src/http/modules/ngx_http_upstream_ip_hash_module.c b/src/http/modules/ngx_http_upstream_ip_hash_module.c --- a/src/http/modules/ngx_http_upstream_ip_hash_module.c +++ b/src/http/modules/ngx_http_upstream_ip_hash_module.c @@ -181,28 +181,14 @@ ngx_http_upstream_get_ip_hash_peer(ngx_p hash = (hash * 113 + iphp->addr[i]) % 6271; } - 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; + w = hash % iphp->rrp.peers->total_weight; + peer = iphp->rrp.peers->peer; + p = 0; - for (peer = iphp->rrp.peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - w -= peer->weight; - if (w < 0) { - break; - } - } - - p = i; + while (w >= peer->weight) { + w -= peer->weight; + peer = peer->next; + p++; } n = p / (8 * sizeof(uintptr_t)); diff --git a/src/stream/ngx_stream_upstream_hash_module.c b/src/stream/ngx_stream_upstream_hash_module.c --- a/src/stream/ngx_stream_upstream_hash_module.c +++ b/src/stream/ngx_stream_upstream_hash_module.c @@ -164,7 +164,7 @@ ngx_stream_upstream_get_hash_peer(ngx_pe uint32_t hash; ngx_int_t w; uintptr_t m; - ngx_uint_t i, n, p; + ngx_uint_t n, p; ngx_stream_upstream_rr_peer_t *peer; ngx_log_debug1(NGX_LOG_DEBUG_STREAM, pc->log, 0, @@ -204,28 +204,14 @@ ngx_stream_upstream_get_hash_peer(ngx_pe hp->hash += hash; hp->rehash++; - if (!hp->rrp.peers->weighted) { - p = hp->hash % hp->rrp.peers->number; - - peer = hp->rrp.peers->peer; - for (i = 0; i < p; i++) { - peer = peer->next; - } - - } else { - w = hp->hash % hp->rrp.peers->total_weight; + w = hp->hash % hp->rrp.peers->total_weight; + peer = hp->rrp.peers->peer; + p = 0; - for (peer = hp->rrp.peers->peer, i = 0; - peer; - peer = peer->next, i++) - { - w -= peer->weight; - if (w < 0) { - break; - } - } - - p = i; + while (w >= peer->weight) { + w -= peer->weight; + peer = peer->next; + p++; } n = p / (8 * sizeof(uintptr_t));