diff --git a/doc/haproxy.txt b/doc/haproxy.txt index 201e71c188..c18a2b29ff 100644 --- a/doc/haproxy.txt +++ b/doc/haproxy.txt @@ -1,9 +1,9 @@ H A - P r o x y --------------- - version 1.1.1 + version 1.1.4 willy tarreau - 2002/03/13 + 2002/03/25 ================ | Introduction | @@ -320,7 +320,14 @@ de connexion TCP toutes les 2 secondes, avec 3 essais pour d un serveur en panne, 2 pour le déclarer utilisable. Un serveur hors d'usage ne sera pas utilisé dans le processus de répartition de charge interne. Pour activer la surveillance, ajouter le mot clé 'check' à la -fin de la déclaration du serveur. +fin de la déclaration du serveur. Il est possible de spécifier +l'intervalle (en millisecondes) séparant deux tests du serveur par le +paramètre "inter", le nombre d'échecs acceptés par le paramètre "fall", +et le nombre de succès avant reprise par le paramètre "rise". +Les paramètres non précisés prennent les valeurs suivantes par défaut : + - inter : 2000 + - rise : 2 + - fall : 3 Exemple : même que précédemment avec surveillance ------- diff --git a/haproxy.c b/haproxy.c index db2779af9c..9c9d659441 100644 --- a/haproxy.c +++ b/haproxy.c @@ -13,6 +13,9 @@ * * ChangeLog : * + * 2002/03/25 + * - released 1.1.4 + * - made rise/fall/interval time configurable * 2002/03/22 * - released 1.1.3 * - fixed a bug : cr_expire and cw_expire were inverted in CL_STSHUT[WR] @@ -99,8 +102,8 @@ #include #endif -#define HAPROXY_VERSION "1.1.3" -#define HAPROXY_DATE "2002/03/22" +#define HAPROXY_VERSION "1.1.4" +#define HAPROXY_DATE "2002/03/25" /* this is for libc5 for example */ #ifndef TCP_NODELAY @@ -136,9 +139,9 @@ /* FIXME: this should be user-configurable */ #define CHK_CONNTIME 2000 -#define CHK_INTERVAL 2000 -#define FALLTIME 3 -#define RISETIME 2 +#define DEF_CHKINTR 2000 +#define DEF_FALLTIME 3 +#define DEF_RISETIME 2 /* how many bits are needed to code the size of an int (eg: 32bits -> 5) */ #define INTBITS 5 @@ -323,6 +326,8 @@ struct server { char *id; /* just for identification */ struct sockaddr_in addr; /* the address to connect to */ int health; /* 0->rise-1 = bad; rise->rise+fall-1 = good */ + int rise, fall; /* time in iterations */ + 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 */ }; @@ -2712,7 +2717,8 @@ int process_chk(struct task *t) { fdtab[fd].state = FD_STCONN; /* connection in progress */ FD_SET(fd, StaticWriteEvent); /* for connect status */ fd_insert(fd); - tv_delayfrom(&t->expire, &now, CHK_CONNTIME); + /* FIXME: we allow up to for a connection to establish, but we should use another parameter */ + tv_delayfrom(&t->expire, &now, s->inter); task_queue(t); /* restore t to its place in the task list */ return tv_remain(&now, &t->expire); } @@ -2726,16 +2732,16 @@ int process_chk(struct task *t) { if (!s->result) { /* nothing done */ //fprintf(stderr, "process_chk: 6\n"); - tv_delayfrom(&t->expire, &now, CHK_INTERVAL); + tv_delayfrom(&t->expire, &now, s->inter); task_queue(t); /* restore t to its place in the task list */ return tv_remain(&now, &t->expire); } /* here, we have seen a failure */ - if (s->health > FALLTIME) + if (s->health > s->rise) s->health--; /* still good */ else { - if (s->health == FALLTIME && !(mode & MODE_QUIET)) + if (s->health == s->rise && !(mode & MODE_QUIET)) Warning("server %s DOWN.\n", s->id); s->health = 0; /* failure */ @@ -2743,7 +2749,8 @@ int process_chk(struct task *t) { } //fprintf(stderr, "process_chk: 7\n"); - tv_delayfrom(&t->expire, &now, CHK_CONNTIME); + /* FIXME: we allow up to for a connection to establish, but we should use another parameter */ + tv_delayfrom(&t->expire, &now, s->inter); } else { //fprintf(stderr, "process_chk: 8\n"); @@ -2751,25 +2758,25 @@ int process_chk(struct task *t) { if (s->result > 0) { /* good server detected */ //fprintf(stderr, "process_chk: 9\n"); s->health++; /* was bad, stays for a while */ - if (s->health >= FALLTIME) { - if (s->health == FALLTIME && !(mode & MODE_QUIET)) + if (s->health >= s->rise) { + if (s->health == s->rise && !(mode & MODE_QUIET)) Warning("server %s UP.\n", s->id); - s->health = FALLTIME + RISETIME -1; /* OK now */ + s->health = s->rise + s->fall - 1; /* OK now */ s->state |= SRV_RUNNING; } s->curfd = -1; /* no check running anymore */ //FD_CLR(fd, StaticWriteEvent); fd_delete(fd); - tv_delayfrom(&t->expire, &now, CHK_INTERVAL); + tv_delayfrom(&t->expire, &now, s->inter); } else if (s->result < 0 || tv_cmp2_ms(&t->expire, &now) <= 0) { //fprintf(stderr, "process_chk: 10\n"); /* failure or timeout detected */ - if (s->health > FALLTIME) + if (s->health > s->rise) s->health--; /* still good */ else { - if (s->health == FALLTIME && !(mode & MODE_QUIET)) + if (s->health == s->rise && !(mode & MODE_QUIET)) Warning("server %s DOWN.\n", s->id); s->health = 0; /* failure */ @@ -2778,7 +2785,7 @@ int process_chk(struct task *t) { s->curfd = -1; //FD_CLR(fd, StaticWriteEvent); fd_delete(fd); - tv_delayfrom(&t->expire, &now, CHK_INTERVAL); + tv_delayfrom(&t->expire, &now, s->inter); } /* if result is 0 and there's no timeout, we have to wait again */ } @@ -3380,8 +3387,11 @@ int readcfgfile(char *file) { newsrv->id = strdup(args[1]); newsrv->addr = *str2sa(args[2]); newsrv->state = SRV_RUNNING; /* early server setup */ - newsrv->health = FALLTIME; /* up, but will fall down at first failure */ newsrv->curfd = -1; /* no health-check in progress */ + newsrv->inter = DEF_CHKINTR; + newsrv->rise = DEF_RISETIME; + newsrv->fall = DEF_FALLTIME; + newsrv->health = newsrv->rise; /* up, but will fall down at first failure */ cur_arg = 3; while (*args[cur_arg]) { if (!strcmp(args[cur_arg], "cookie")) { @@ -3389,6 +3399,19 @@ int readcfgfile(char *file) { newsrv->cklen = strlen(args[cur_arg + 1]); cur_arg += 2; } + else if (!strcmp(args[cur_arg], "rise")) { + newsrv->rise = atol(args[cur_arg + 1]); + newsrv->health = newsrv->rise; + cur_arg += 2; + } + else if (!strcmp(args[cur_arg], "fall")) { + newsrv->fall = atol(args[cur_arg + 1]); + cur_arg += 2; + } + else if (!strcmp(args[cur_arg], "inter")) { + newsrv->inter = atol(args[cur_arg + 1]); + cur_arg += 2; + } else if (!strcmp(args[cur_arg], "check")) { struct task *t; @@ -3403,9 +3426,11 @@ int readcfgfile(char *file) { t->process = process_chk; t->context = newsrv; - tv_delayfrom(&t->expire, &now, CHK_INTERVAL); /* check this every ms */ - task_queue(t); - task_wakeup(&rq, t); + if (curproxy->state != PR_STDISABLED) { + tv_delayfrom(&t->expire, &now, newsrv->inter); /* check this every ms */ + task_queue(t); + task_wakeup(&rq, t); + } cur_arg += 1; }