From: Willy Tarreau Date: Wed, 11 Dec 2013 19:11:55 +0000 (+0100) Subject: MINOR: checks: replace state DISABLED with CONFIGURED and ENABLED X-Git-Tag: v1.5-dev20~27 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=2e10f5a759ffb51d26915f0ff3f59d4f05803064;p=thirdparty%2Fhaproxy.git MINOR: checks: replace state DISABLED with CONFIGURED and ENABLED At the moment, health checks and agent checks are tied : no agent check is emitted if no health check is enabled. Other parameters are considered in the condition for letting checks run. It will help us selectively enable checks (agent and regular checks) to be know whether they're enabled/disabled and configured or not. Now we can already emit an error when trying to enable an unconfigured agent. --- diff --git a/include/types/checks.h b/include/types/checks.h index b944cd38b3..252cb15b68 100644 --- a/include/types/checks.h +++ b/include/types/checks.h @@ -36,7 +36,8 @@ enum chk_result { /* flags used by check->state */ #define CHK_ST_INPROGRESS 0x0001 /* a check is currently running */ -#define CHK_ST_DISABLED 0x0002 /* this check is currently administratively disabled */ +#define CHK_ST_CONFIGURED 0x0002 /* this check is configured and may be enabled */ +#define CHK_ST_ENABLED 0x0004 /* this check is currently administratively enabled */ /* check status */ enum { diff --git a/src/cfgparse.c b/src/cfgparse.c index aa8bb90cf2..b67594114b 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -5123,6 +5123,7 @@ stats_error_parsing: goto out; } + newsrv->check.state |= CHK_ST_CONFIGURED | CHK_ST_ENABLED; newsrv->state |= SRV_CHECKED; } @@ -5145,6 +5146,7 @@ stats_error_parsing: goto out; } + newsrv->agent.state |= CHK_ST_CONFIGURED | CHK_ST_ENABLED; newsrv->state |= SRV_AGENT_CHECKED; } diff --git a/src/checks.c b/src/checks.c index 321557705b..49bb411955 100644 --- a/src/checks.c +++ b/src/checks.c @@ -1165,7 +1165,7 @@ static void event_srv_chk_r(struct connection *conn) * parameter of this function is the agent or check field * of the server. */ - disabled = check->server->agent.state & CHK_ST_DISABLED; + disabled = !(check->server->agent.state & CHK_ST_ENABLED); if (strchr(check->bi->data, '%')) { if (disabled) @@ -1509,7 +1509,7 @@ static struct task *process_chk(struct task *t) if (!(s->state & SRV_CHECKED) || s->proxy->state == PR_STSTOPPED || (s->state & SRV_MAINTAIN) || - (check->state & CHK_ST_DISABLED)) + !(check->state & CHK_ST_ENABLED)) goto reschedule; /* we'll initiate a new check */ diff --git a/src/dumpstats.c b/src/dumpstats.c index ff8557a368..350b111035 100644 --- a/src/dumpstats.c +++ b/src/dumpstats.c @@ -1528,7 +1528,13 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line) if (!sv) return 1; - sv->agent.state &= ~CHK_ST_DISABLED; + if (!(sv->agent.state & CHK_ST_CONFIGURED)) { + appctx->ctx.cli.msg = "Agent was not configured on this server, cannot enable.\n"; + appctx->st0 = STAT_CLI_PRINT; + return 1; + } + + sv->agent.state |= CHK_ST_ENABLED; return 1; } if (strcmp(args[1], "server") == 0) { @@ -1599,7 +1605,7 @@ static int stats_sock_parse_request(struct stream_interface *si, char *line) if (!sv) return 1; - sv->agent.state |= CHK_ST_DISABLED; + sv->agent.state &= ~CHK_ST_ENABLED; return 1; } else if (strcmp(args[1], "server") == 0) {