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>
This commit is contained in:
Simon Horman 2013-02-12 10:45:52 +09:00 committed by Willy Tarreau
parent 7d09b9a4df
commit 58b5d292b3
2 changed files with 19 additions and 13 deletions

View File

@ -11439,18 +11439,19 @@ set timeout cli <delay>
set weight <backend>/<server> <weight>[%] set weight <backend>/<server> <weight>[%]
Change a server's weight to the value passed in argument. If the value ends 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 with the '%' sign, then the new weight will be relative to the initially
configured weight. Relative weights are only permitted between 0 and 100%, configured weight. Absolute weights are permitted between 0 and 256.
and absolute weights are permitted between 0 and 256. Servers which are part Relative weights must be positive with the resulting absolute weight is
of a farm running a static load-balancing algorithm have stricter limitations capped at 256. Servers which are part of a farm running a static
because the weight cannot change once set. Thus for these servers, the only load-balancing algorithm have stricter limitations because the weight
accepted values are 0 and 100% (or 0 and the initial weight). Changes take cannot change once set. Thus for these servers, the only accepted values
effect immediately, though certain LB algorithms require a certain amount of are 0 and 100% (or 0 and the initial weight). Changes take effect
requests to consider changes. A typical usage of this command is to disable immediately, though certain LB algorithms require a certain amount of
a server during an update by setting its weight to zero, then to enable it requests to consider changes. A typical usage of this command is to
again after the update by setting it back to 100%. This command is restricted disable a server during an update by setting its weight to zero, then to
and can only be issued on sockets configured for level "admin". Both the enable it again after the update by setting it back to 100%. This command
backend and the server may be specified either by their name or by their is restricted and can only be issued on sockets configured for level
numeric ID, prefixed with a sharp ('#'). "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>] show errors [<iid>]
Dump last known request and response errors collected by frontends and Dump last known request and response errors collected by frontends and

View File

@ -176,9 +176,14 @@ const char *server_parse_weight_change_request(struct server *sv,
w = atoi(weight_str); w = atoi(weight_str);
if (strchr(weight_str, '%') != NULL) { if (strchr(weight_str, '%') != NULL) {
if (w < 0 || w > 100) if (w < 0)
return "Relative weight must be positive.\n"; return "Relative weight must be positive.\n";
/* Avoid integer overflow */
if (w > 25600)
w = 25600;
w = sv->iweight * w / 100; w = sv->iweight * w / 100;
if (w > 256)
w = 256;
} }
else if (w < 0 || w > 256) else if (w < 0 || w > 256)
return "Absolute weight can only be between 0 and 256 inclusive.\n"; return "Absolute weight can only be between 0 and 256 inclusive.\n";