From 2e10f5a759ffb51d26915f0ff3f59d4f05803064 Mon Sep 17 00:00:00 2001 From: Willy Tarreau Date: Wed, 11 Dec 2013 20:11:55 +0100 Subject: [PATCH] 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. --- include/types/checks.h | 3 ++- src/cfgparse.c | 2 ++ src/checks.c | 4 ++-- src/dumpstats.c | 10 ++++++++-- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/include/types/checks.h b/include/types/checks.h index b944cd38b..252cb15b6 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 aa8bb90cf..b67594114 100644 --- a/src/cfgparse.c +++ b/src/cfgparse.c @@ -5123,6 +5123,7 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) goto out; } + newsrv->check.state |= CHK_ST_CONFIGURED | CHK_ST_ENABLED; newsrv->state |= SRV_CHECKED; } @@ -5145,6 +5146,7 @@ int cfg_parse_listen(const char *file, int linenum, char **args, int kwm) 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 321557705..49bb41195 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 ff8557a36..350b11103 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) {