diff src/http/modules/ngx_http_upstream_hash_module.c @ 6121:b6047abf5f30

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.
author Ruslan Ermilov <ru@nginx.com>
date Tue, 21 Apr 2015 19:09:04 +0300
parents 3264b7828f72
children bf8b6534db3a
line wrap: on
line diff
--- 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));