]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
[MEDIUM] support setting a server weight to zero
authorWilly Tarreau <w@1wt.eu>
Mon, 15 Jun 2009 08:56:05 +0000 (10:56 +0200)
committerWilly Tarreau <w@1wt.eu>
Tue, 14 Jul 2009 18:15:27 +0000 (20:15 +0200)
Sometimes it is useful to be able to set a server's weight to zero.
It allows the server to receive only persistent traffic but never
normal traffic.
(cherry picked from commit 6704d67d656574a602ddf81a603cdb4f482f90a9)

doc/configuration.txt
src/backend.c
src/cfgparse.c

index e4b5e839115eaf3dff78a505a92fae345241c77f..e521cc15ea0097bb5483d752a8aad1e5ff108b85 100644 (file)
@@ -4400,11 +4400,12 @@ weight <weight>
   The "weight" parameter is used to adjust the server's weight relative to
   other servers. All servers will receive a load proportional to their weight
   relative to the sum of all weights, so the higher the weight, the higher the
-  load. The default weight is 1, and the maximal value is 255. If this
-  parameter is used to distribute the load according to server's capacity, it
-  is recommended to start with values which can both grow and shrink, for
-  instance between 10 and 100 to leave enough room above and below for later
-  adjustments.
+  load. The default weight is 1, and the maximal value is 256. A value of 0
+  means the server will not participate in load-balancing but will still accept
+  persistent connections. If this parameter is used to distribute the load
+  according to server's capacity, it is recommended to start with values which
+  can both grow and shrink, for instance between 10 and 100 to leave enough
+  room above and below for later adjustments.
 
 
 6. HTTP header manipulation
index b830bdb920df126dfbc22ce155c50a114f12852d..bb830f2904847c0b525d2aa1c1e76e9d2b784812 100644 (file)
@@ -201,7 +201,8 @@ void recalc_server_map(struct proxy *px)
                int max = 0;
                best = NULL;
                for (cur = px->srv; cur; cur = cur->next) {
-                       if (flag == (cur->state &
+                       if (cur->eweight &&
+                           flag == (cur->state &
                                     (SRV_RUNNING | SRV_GOINGDOWN | SRV_BACKUP))) {
                                int v;
 
@@ -248,15 +249,24 @@ void init_server_map(struct proxy *p)
                return;
 
        /* We will factor the weights to reduce the table,
-        * using Euclide's largest common divisor algorithm
+        * using Euclide's largest common divisor algorithm.
+        * Since we may have zero weights, we have to first
+        * find a non-zero weight server.
         */
-       pgcd = p->srv->uweight;
-       for (srv = p->srv->next; srv && pgcd > 1; srv = srv->next) {
-               int w = srv->uweight;
-               while (w) {
-                       int t = pgcd % w;
-                       pgcd = w;
-                       w = t;
+       pgcd = 1;
+       srv = p->srv;
+       while (srv && !srv->uweight)
+               srv = srv->next;
+
+       if (srv) {
+               pgcd = srv->uweight; /* note: cannot be zero */
+               while (pgcd > 1 && (srv = srv->next)) {
+                       int w = srv->uweight;
+                       while (w) {
+                               int t = pgcd % w;
+                               pgcd = w;
+                               w = t;
+                       }
                }
        }
 
@@ -281,6 +291,9 @@ void init_server_map(struct proxy *p)
        if (act < bck)
                act = bck;
 
+       if (!act)
+               act = 1;
+
        p->lbprm.map.srv = (struct server **)calloc(act, sizeof(struct server *));
        /* recounts servers and their weights */
        p->lbprm.map.state = PR_MAP_RECALC;
index b268d598ae1af2a522460e74b9881ec21535782c..3114764571694813fbdb5ac19fa89d5650747023 100644 (file)
@@ -2126,8 +2126,8 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int inv)
                        else if (!strcmp(args[cur_arg], "weight")) {
                                int w;
                                w = atol(args[cur_arg + 1]);
-                               if (w < 1 || w > 256) {
-                                       Alert("parsing [%s:%d] : weight of server %s is not within 1 and 256 (%d).\n",
+                               if (w < 0 || w > 256) {
+                                       Alert("parsing [%s:%d] : weight of server %s is not within 0 and 256 (%d).\n",
                                              file, linenum, newsrv->id, w);
                                        return -1;
                                }