]> git.kaiwu.me - nginx.git/commitdiff
Upstream: weights support in ip_hash balancer.
authorMaxim Dounin <mdounin@mdounin.ru>
Sun, 3 Jun 2012 23:22:41 +0000 (23:22 +0000)
committerMaxim Dounin <mdounin@mdounin.ru>
Sun, 3 Jun 2012 23:22:41 +0000 (23:22 +0000)
src/http/modules/ngx_http_upstream_ip_hash_module.c
src/http/ngx_http_upstream_round_robin.c
src/http/ngx_http_upstream_round_robin.h

index 100ea34dd04eee21b522565b56a68c45fd29d207..0eadc7d94eb979e15d9cb37ece9a6a7a068659a5 100644 (file)
@@ -140,6 +140,7 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
     ngx_http_upstream_ip_hash_peer_data_t  *iphp = data;
 
     time_t                        now;
+    ngx_int_t                     w;
     uintptr_t                     m;
     ngx_uint_t                    i, n, p, hash;
     ngx_http_upstream_rr_peer_t  *peer;
@@ -166,7 +167,21 @@ ngx_http_upstream_get_ip_hash_peer(ngx_peer_connection_t *pc, void *data)
             hash = (hash * 113 + iphp->addr[i]) % 6271;
         }
 
-        p = hash % iphp->rrp.peers->number;
+        if (!iphp->rrp.peers->weighted) {
+            p = hash % iphp->rrp.peers->number;
+
+        } else {
+            w = hash % iphp->rrp.peers->total_weight;
+
+            for (i = 0; i < iphp->rrp.peers->number; i++) {
+                w -= iphp->rrp.peers->peer[i].weight;
+                if (w < 0) {
+                    break;
+                }
+            }
+
+            p = i;
+        }
 
         n = p / (8 * sizeof(uintptr_t));
         m = (uintptr_t) 1 << p % (8 * sizeof(uintptr_t));
@@ -229,6 +244,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_WEIGHT
                   |NGX_HTTP_UPSTREAM_MAX_FAILS
                   |NGX_HTTP_UPSTREAM_FAIL_TIMEOUT
                   |NGX_HTTP_UPSTREAM_DOWN;
index 214de7b74fce5b383b1b1d89ebf7e7f29204da23..c4998fca5194f7bb9202644a4adbe3778aac1800 100644 (file)
@@ -30,7 +30,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
     ngx_http_upstream_srv_conf_t *us)
 {
     ngx_url_t                      u;
-    ngx_uint_t                     i, j, n;
+    ngx_uint_t                     i, j, n, w;
     ngx_http_upstream_server_t    *server;
     ngx_http_upstream_rr_peers_t  *peers, *backup;
 
@@ -40,6 +40,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
         server = us->servers->elts;
 
         n = 0;
+        w = 0;
 
         for (i = 0; i < us->servers->nelts; i++) {
             if (server[i].backup) {
@@ -47,6 +48,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
             }
 
             n += server[i].naddrs;
+            w += server[i].naddrs * server[i].weight;
         }
 
         if (n == 0) {
@@ -64,6 +66,8 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
 
         peers->single = (n == 1);
         peers->number = n;
+        peers->weighted = (w != n);
+        peers->total_weight = w;
         peers->name = &us->host;
 
         n = 0;
@@ -96,6 +100,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
         /* backup servers */
 
         n = 0;
+        w = 0;
 
         for (i = 0; i < us->servers->nelts; i++) {
             if (!server[i].backup) {
@@ -103,6 +108,7 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
             }
 
             n += server[i].naddrs;
+            w += server[i].naddrs * server[i].weight;
         }
 
         if (n == 0) {
@@ -118,6 +124,8 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
         peers->single = 0;
         backup->single = 0;
         backup->number = n;
+        backup->weighted = (w != n);
+        backup->total_weight = w;
         backup->name = &us->host;
 
         n = 0;
@@ -185,6 +193,8 @@ ngx_http_upstream_init_round_robin(ngx_conf_t *cf,
 
     peers->single = (n == 1);
     peers->number = n;
+    peers->weighted = 0;
+    peers->total_weight = n;
     peers->name = &us->host;
 
     for (i = 0; i < u.naddrs; i++) {
index 4de3caea1b069f068f14212f788716e38e0032c4..3f8cbf87f7f56659b35e4edb83159dada3a23a78 100644 (file)
@@ -41,13 +41,17 @@ typedef struct {
 typedef struct ngx_http_upstream_rr_peers_s  ngx_http_upstream_rr_peers_t;
 
 struct ngx_http_upstream_rr_peers_s {
-    ngx_uint_t                      single;        /* unsigned  single:1; */
     ngx_uint_t                      number;
     ngx_uint_t                      last_cached;
 
  /* ngx_mutex_t                    *mutex; */
     ngx_connection_t              **cached;
 
+    ngx_uint_t                      total_weight;
+
+    unsigned                        single:1;
+    unsigned                        weighted:1;
+
     ngx_str_t                      *name;
 
     ngx_http_upstream_rr_peers_t   *next;