int inter, fastinter, downinter; /* checks: time in milliseconds */
int result; /* health-check result : SRV_CHK_* */
int state; /* health-check result : CHK_* */
+ int health; /* 0 to server->rise-1 = bad;
+ * rise to server->rise+server->fall-1 = good */
int type; /* Check type, one of PR_O2_*_CHK */
struct server *server; /* back-pointer to server */
};
struct server *tracknext, *track; /* next server in a tracking list, tracked server */
char *trackit; /* temporary variable to make assignment deferrable */
- int health; /* 0->rise-1 = bad; rise->rise+fall-1 = good */
int consecutive_errors; /* current number of consecutive errors */
int rise, fall; /* time in iterations */
int consecutive_errors_limit; /* number of consecutive errors that triggers an event */
newsrv->uweight = newsrv->iweight
= curproxy->defsrv.iweight;
- newsrv->health = newsrv->rise; /* up, but will fall down at first failure */
-
newsrv->check.status = HCHK_STATUS_INI;
+ newsrv->check.health = newsrv->rise; /* up, but will fall down at first failure */
newsrv->check.server = newsrv;
cur_arg = 3;
goto out;
}
- if (newsrv->health)
- newsrv->health = newsrv->rise;
+ if (newsrv->check.health)
+ newsrv->check.health = newsrv->rise;
cur_arg += 2;
}
else if (!strcmp(args[cur_arg], "fall")) {
else if (!defsrv && !strcmp(args[cur_arg], "disabled")) {
newsrv->state |= SRV_MAINTAIN;
newsrv->state &= ~SRV_RUNNING;
- newsrv->health = 0;
+ newsrv->check.health = 0;
cur_arg += 1;
}
else if (!defsrv && !strcmp(args[cur_arg], "observe")) {
if (srv->state & SRV_MAINTAIN) {
newsrv->state |= SRV_MAINTAIN;
newsrv->state &= ~SRV_RUNNING;
- newsrv->health = 0;
+ newsrv->check.health = 0;
}
newsrv->track = srv;
}
if (s->proxy->options2 & PR_O2_LOGHCHKS &&
- (((s->health != 0) && (check->result & SRV_CHK_FAILED)) ||
- ((s->health != s->rise + s->fall - 1) && (check->result & SRV_CHK_PASSED)) ||
+ (((check->health != 0) && (check->result & SRV_CHK_FAILED)) ||
+ ((check->health != s->rise + s->fall - 1) && (check->result & SRV_CHK_PASSED)) ||
((s->state & SRV_GOINGDOWN) && !(check->result & SRV_CHK_DISABLE)) ||
(!(s->state & SRV_GOINGDOWN) && (check->result & SRV_CHK_DISABLE)))) {
chunk_reset(&trash);
/* FIXME begin: calculate local version of the health/rise/fall/state */
- health = s->health;
+ health = check->health;
rise = s->rise;
fall = s->fall;
state = s->state;
int xferred;
if (s->state & SRV_MAINTAIN) {
- s->health = s->rise;
+ check->health = s->rise;
}
- if (s->health == s->rise || s->track) {
+ if (check->health == s->rise || s->track) {
int srv_was_paused = s->state & SRV_GOINGDOWN;
int prev_srv_count = s->proxy->srv_bck + s->proxy->srv_act;
set_server_down(check);
}
- s->health = 0; /* failure */
+ check->health = 0; /* failure */
}
void set_server_up(struct check *check) {
unsigned int old_state = s->state;
if (s->state & SRV_MAINTAIN) {
- s->health = s->rise;
+ check->health = s->rise;
}
- if (s->health == s->rise || s->track) {
+ if (check->health == s->rise || s->track) {
if (s->proxy->srv_bck == 0 && s->proxy->srv_act == 0) {
if (s->proxy->last_change < now.tv_sec) // ignore negative times
s->proxy->down_time += now.tv_sec - s->proxy->last_change;
set_server_up(check);
}
- if (s->health >= s->rise)
- s->health = s->rise + s->fall - 1; /* OK now */
+ if (check->health >= s->rise)
+ check->health = s->rise + s->fall - 1; /* OK now */
}
case HANA_ONERR_SUDDTH:
/* simulate a pre-fatal failed health check */
- if (s->health > s->rise)
- s->health = s->rise + 1;
+ if (s->check.health > s->rise)
+ s->check.health = s->rise + 1;
/* no break - fall through */
/* simulate a failed health check */
set_server_check_status(&s->check, HCHK_STATUS_HANA, trash.str);
- if (s->health > s->rise) {
- s->health--; /* still good */
+ if (s->check.health > s->rise) {
+ s->check.health--; /* still good */
s->counters.failed_checks++;
}
else
case HANA_ONERR_MARKDWN:
/* mark server down */
- s->health = s->rise;
+ s->check.health = s->rise;
set_server_check_status(&s->check, HCHK_STATUS_HANA, trash.str);
set_server_down(&s->check);
if (!(s->state & SRV_CHECKED))
sv_state = 6; /* should obviously never happen */
else if (s->state & SRV_RUNNING) {
- if (s->health == s->rise + s->fall - 1)
+ if (s->check.health == s->rise + s->fall - 1)
sv_state = 3; /* UP */
else
sv_state = 2; /* going down */
if (s->state & SRV_GOINGDOWN)
sv_state += 2;
} else {
- if (s->health)
+ if (s->check.health)
sv_state = 1; /* going up */
else
sv_state = 0; /* DOWN */
hlen += sprintf(buffer + hlen,
srv_hlt_st[sv_state],
- (s->state & SRV_RUNNING) ? (s->health - s->rise + 1) : (s->health),
+ (s->state & SRV_RUNNING) ? (s->check.health - s->rise + 1) : (s->check.health),
(s->state & SRV_RUNNING) ? (s->fall) : (s->rise));
hlen += sprintf(buffer + hlen, "; name=%s/%s; node=%s; weight=%d/%d; scur=%d/%d; qcur=%d",
/* here, we have seen a synchronous error, no fd was allocated */
check->state &= ~CHK_STATE_RUNNING;
- if (s->health > s->rise) {
- s->health--; /* still good */
+ if (check->health > s->rise) {
+ check->health--; /* still good */
s->counters.failed_checks++;
}
else
conn_full_close(conn);
}
- if (s->check.result & SRV_CHK_FAILED) { /* a failure or timeout detected */
- if (s->health > s->rise) {
- s->health--; /* still good */
+ if (check->result & SRV_CHK_FAILED) { /* a failure or timeout detected */
+ if (check->health > s->rise) {
+ check->health--; /* still good */
s->counters.failed_checks++;
}
else
set_server_disabled(check);
}
- if (s->health < s->rise + s->fall - 1) {
- s->health++; /* was bad, stays for a while */
+ if (check->health < s->rise + s->fall - 1) {
+ check->health++; /* was bad, stays for a while */
set_server_up(check);
}
}
*/
if (sv->track->state & SRV_RUNNING) {
set_server_up(&sv->check);
- sv->health = sv->rise; /* up, but will fall down at first failure */
+ sv->check.health = sv->rise; /* up, but will fall down at first failure */
} else {
sv->state &= ~SRV_MAINTAIN;
set_server_down(&sv->check);
}
} else {
set_server_up(&sv->check);
- sv->health = sv->rise; /* up, but will fall down at first failure */
+ sv->check.health = sv->rise; /* up, but will fall down at first failure */
}
}
chunk_appendf(&trash, "%s ", human_time(now.tv_sec - ref->last_change, 1));
chunk_appendf(&trash,
srv_hlt_st[state],
- (ref->state & SRV_RUNNING) ? (ref->health - ref->rise + 1) : (ref->health),
+ (ref->state & SRV_RUNNING) ? (ref->check.health - ref->rise + 1) : (ref->check.health),
(ref->state & SRV_RUNNING) ? (ref->fall) : (ref->rise));
}
else
chunk_appendf(&trash,
srv_hlt_st[state],
- (ref->state & SRV_RUNNING) ? (ref->health - ref->rise + 1) : (ref->health),
+ (ref->state & SRV_RUNNING) ? (ref->check.health - ref->rise + 1) : (ref->check.health),
(ref->state & SRV_RUNNING) ? (ref->fall) : (ref->rise));
chunk_appendf(&trash,
if (!(svs->state & SRV_CHECKED))
sv_state = 6;
else if (svs->state & SRV_RUNNING) {
- if (svs->health == svs->rise + svs->fall - 1)
+ if (svs->check.health == svs->rise + svs->fall - 1)
sv_state = 3; /* UP */
else
sv_state = 2; /* going down */
sv_state += 2;
}
else
- if (svs->health)
+ if (svs->check.health)
sv_state = 1; /* going up */
else
sv_state = 0; /* DOWN */