MEDIUM: server: Allow relative weights greater than 100%
Allow relative weights greater than 100%,
capping the absolute value to 256 which is
the largest supported absolute weight.
Signed-off-by: Simon Horman <horms@verge.net.au>
diff --git a/doc/configuration.txt b/doc/configuration.txt
index 5f7a65b..df8e70c 100644
--- a/doc/configuration.txt
+++ b/doc/configuration.txt
@@ -11439,18 +11439,19 @@
set weight <backend>/<server> <weight>[%]
Change a server's weight to the value passed in argument. If the value ends
with the '%' sign, then the new weight will be relative to the initially
- configured weight. Relative weights are only permitted between 0 and 100%,
- and absolute weights are permitted between 0 and 256. Servers which are part
- of a farm running a static load-balancing algorithm have stricter limitations
- because the weight cannot change once set. Thus for these servers, the only
- accepted values are 0 and 100% (or 0 and the initial weight). Changes take
- effect immediately, though certain LB algorithms require a certain amount of
- requests to consider changes. A typical usage of this command is to disable
- a server during an update by setting its weight to zero, then to enable it
- again after the update by setting it back to 100%. This command is restricted
- and can only be issued on sockets configured for level "admin". Both the
- backend and the server may be specified either by their name or by their
- numeric ID, prefixed with a sharp ('#').
+ configured weight. Absolute weights are permitted between 0 and 256.
+ Relative weights must be positive with the resulting absolute weight is
+ capped at 256. Servers which are part of a farm running a static
+ load-balancing algorithm have stricter limitations because the weight
+ cannot change once set. Thus for these servers, the only accepted values
+ are 0 and 100% (or 0 and the initial weight). Changes take effect
+ immediately, though certain LB algorithms require a certain amount of
+ requests to consider changes. A typical usage of this command is to
+ disable a server during an update by setting its weight to zero, then to
+ enable it again after the update by setting it back to 100%. This command
+ is restricted and can only be issued on sockets configured for level
+ "admin". Both the backend and the server may be specified either by their
+ name or by their numeric ID, prefixed with a sharp ('#').
show errors [<iid>]
Dump last known request and response errors collected by frontends and
diff --git a/src/server.c b/src/server.c
index 7a2774c..4c1762f 100644
--- a/src/server.c
+++ b/src/server.c
@@ -176,9 +176,14 @@
w = atoi(weight_str);
if (strchr(weight_str, '%') != NULL) {
- if (w < 0 || w > 100)
+ if (w < 0)
return "Relative weight must be positive.\n";
+ /* Avoid integer overflow */
+ if (w > 25600)
+ w = 25600;
w = sv->iweight * w / 100;
+ if (w > 256)
+ w = 256;
}
else if (w < 0 || w > 256)
return "Absolute weight can only be between 0 and 256 inclusive.\n";