[MEDIUM] support setting a server weight to zero

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.
This commit is contained in:
Willy Tarreau 2009-06-15 10:56:05 +02:00
parent be1b91842a
commit 6704d67d65
3 changed files with 30 additions and 16 deletions

View File

@ -4476,11 +4476,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

View File

@ -203,7 +203,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;
@ -250,15 +251,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;
}
}
}
@ -283,6 +293,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;

View File

@ -2185,8 +2185,8 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm)
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;
}