mirror of
http://git.haproxy.org/git/haproxy.git/
synced 2024-12-13 23:14:46 +00:00
* added the 'weight' parameter to the servers, limited to 1..256.
It is factored between all the servers so that the servers map will be smaller and easier to construct.
This commit is contained in:
parent
43b1512834
commit
e3f023f677
38
haproxy.c
38
haproxy.c
@ -511,6 +511,8 @@ struct server {
|
||||
int inter; /* time in milliseconds */
|
||||
int result; /* 0 = connect OK, -1 = connect KO */
|
||||
int curfd; /* file desc used for current test, or -1 if not in test */
|
||||
unsigned char uweight, eweight; /* user-specified weight-1, and effective weight-1 */
|
||||
unsigned short wsquare; /* eweight*eweight, to speed up map computation */
|
||||
struct proxy *proxy; /* the proxy this server belongs to */
|
||||
};
|
||||
|
||||
@ -7075,6 +7077,17 @@ int cfg_parse_listen(char *file, int linenum, char **args) {
|
||||
newsrv->state |= SRV_BACKUP;
|
||||
cur_arg ++;
|
||||
}
|
||||
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",
|
||||
file, linenum, newsrv->id, w);
|
||||
return -1;
|
||||
}
|
||||
newsrv->uweight = w - 1;
|
||||
cur_arg += 2;
|
||||
}
|
||||
else if (!strcmp(args[cur_arg], "check")) {
|
||||
global.maxsock++;
|
||||
do_check = 1;
|
||||
@ -7091,7 +7104,7 @@ int cfg_parse_listen(char *file, int linenum, char **args) {
|
||||
cur_arg += 2;
|
||||
}
|
||||
else {
|
||||
Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'check', 'inter', 'rise', 'fall', 'port' and 'source'.\n",
|
||||
Alert("parsing [%s:%d] : server %s only supports options 'backup', 'cookie', 'check', 'inter', 'rise', 'fall', 'port', 'source', and 'weight'.\n",
|
||||
file, linenum, newsrv->id);
|
||||
return -1;
|
||||
}
|
||||
@ -7873,9 +7886,26 @@ int readcfgfile(char *file) {
|
||||
cfgerr++;
|
||||
}
|
||||
else {
|
||||
while (newsrv != NULL) {
|
||||
/* nothing to check for now */
|
||||
newsrv = newsrv->next;
|
||||
struct server *srv;
|
||||
int pgcd;
|
||||
|
||||
if (newsrv) {
|
||||
/* We will factor the weights to reduce the table,
|
||||
* using Euclide's largest common divisor algorithm
|
||||
*/
|
||||
pgcd = newsrv->uweight + 1;
|
||||
for (srv = newsrv->next; srv && pgcd > 1; srv = srv->next) {
|
||||
int t, w;
|
||||
|
||||
w = srv->uweight + 1;
|
||||
while (w) {
|
||||
t = pgcd % w;
|
||||
pgcd = w;
|
||||
w = t;
|
||||
}
|
||||
}
|
||||
for (srv = newsrv; srv; srv = srv->next)
|
||||
srv->eweight = ((srv->uweight + 1) / pgcd) - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user