]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: server: Handle weight increase in consistent hash.
authorOlivier Houchard <ohouchard@haproxy.com>
Tue, 17 Oct 2017 13:52:59 +0000 (15:52 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 17 Oct 2017 16:08:38 +0000 (18:08 +0200)
When the server weight is rised using the CLI, extra nodes have to be
allocated, or the weight will be effectively the same as the original one.

[wt: given that the doc made no explicit mention about this limitation,
this patch could even be backported as it fixes an unexpected behaviour]

src/lb_chash.c

index 82124bc27bddfd933ef0ad7df296690891e1207a..f368b684e8bedfa5ea9baddaa4ca7b6dc8426245 100644 (file)
@@ -78,6 +78,25 @@ static inline void chash_queue_dequeue_srv(struct server *s)
                eb32_delete(&s->lb_nodes[s->lb_nodes_now].node);
        }
 
+       /* Attempt to increase the total number of nodes, if the user
+        * increased the weight beyond the original weight
+        */
+       if (s->lb_nodes_tot < s->next_eweight) {
+               struct tree_occ *new_nodes = realloc(s->lb_nodes, s->next_eweight);
+
+               if (new_nodes) {
+                       unsigned int j;
+
+                       s->lb_nodes = new_nodes;
+                       memset(&s->lb_nodes[s->lb_nodes_tot], 0,
+                           (s->next_eweight - s->lb_nodes_tot) * sizeof(*s->lb_nodes));
+                       for (j = s->lb_nodes_tot; j < s->next_eweight; j++) {
+                               s->lb_nodes[j].server = s;
+                               s->lb_nodes[j].node.key = full_hash(s->puid * SRV_EWGHT_RANGE + j);
+                       }
+                       s->lb_nodes_tot = s->next_eweight;
+               }
+       }
        while (s->lb_nodes_now < s->next_eweight) {
                if (s->lb_nodes_now >= s->lb_nodes_tot) // should always be false anyway
                        break;