From 978119caa68f11356d0b7c025a9a195fe9ed44ae Mon Sep 17 00:00:00 2001 From: Christopher Faulet Date: Thu, 26 Mar 2026 09:14:58 +0100 Subject: [PATCH] MINOR: tcpcheck: Deal with disable-on-404 and send-state in the tcp-check itself disable-on-404 and send-state options, configured on an HTTP healtcheck, were handled as proxy options. Now, these options are handled in the tcp-check itself. So the corresponding PR_O and PR_02 flags are removed. --- include/haproxy/proxy-t.h | 5 ++--- include/haproxy/tcpcheck-t.h | 4 ++++ src/proxy.c | 16 ---------------- src/server.c | 16 ++++++++++------ src/tcpcheck.c | 37 ++++++++++++++++++------------------ 5 files changed, 34 insertions(+), 44 deletions(-) diff --git a/include/haproxy/proxy-t.h b/include/haproxy/proxy-t.h index 0960de70b..4ab6fccb0 100644 --- a/include/haproxy/proxy-t.h +++ b/include/haproxy/proxy-t.h @@ -119,8 +119,7 @@ enum PR_SRV_STATE_FILE { #define PR_O_TCPCHK_SSL 0x10000000 /* at least one TCPCHECK connect rule requires SSL */ #define PR_O_CONTSTATS 0x20000000 /* continuous counters */ -#define PR_O_DISABLE404 0x40000000 /* Disable a server on a 404 response to a health-check */ -/* unused: 0x80000000 */ +/* unused: 0x40000000..0x80000000 */ /* bits for proxy->options2 */ #define PR_O2_SPLIC_REQ 0x00000001 /* transfer requests using linux kernel's splice() */ @@ -145,7 +144,7 @@ enum PR_SRV_STATE_FILE { #define PR_O2_NODELAY 0x00020000 /* fully interactive mode, never delay outgoing data */ #define PR_O2_USE_PXHDR 0x00040000 /* use Proxy-Connection for proxy requests */ -#define PR_O2_CHK_SNDST 0x00080000 /* send the state of each server along with HTTP health checks */ +/* unused: 0x00080000 */ #define PR_O2_SRC_ADDR 0x00100000 /* get the source ip and port for logs */ diff --git a/include/haproxy/tcpcheck-t.h b/include/haproxy/tcpcheck-t.h index b35d60c7f..a0879b65d 100644 --- a/include/haproxy/tcpcheck-t.h +++ b/include/haproxy/tcpcheck-t.h @@ -109,6 +109,10 @@ enum tcpcheck_rule_type { #define TCPCHK_FL_UNUSED_HTTP_RS 0x00000002 /* An unused http-check ruleset exists for the current proxy */ #define TCPCHK_FL_UNUSED_RS 0x00000003 /* Mask for unused ruleset */ +#define TCPCHK_RULES_NONE 0x00000000 +#define TCPCHK_RULES_DISABLE404 0x00000001 /* Disable a server on a 404 response wht HTTP health checks */ +#define TCPCHK_RULES_SNDST 0x00000002 /* send the state of each server along with HTTP health checks */ + #define TCPCHK_RULES_PGSQL_CHK 0x00000010 #define TCPCHK_RULES_REDIS_CHK 0x00000020 #define TCPCHK_RULES_SMTP_CHK 0x00000030 diff --git a/src/proxy.c b/src/proxy.c index e9f9021a9..494f4f5d6 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -1882,22 +1882,6 @@ int proxy_finalize(struct proxy *px, int *err_code) *err_code |= ERR_WARN; } - if ((px->options2 & PR_O2_CHK_ANY) == PR_O2_TCPCHK_CHK && - px->tcpcheck.rs && (px->tcpcheck.rs->flags & TCPCHK_RULES_PROTO_CHK) != TCPCHK_RULES_HTTP_CHK) { - if (px->options & PR_O_DISABLE404) { - ha_warning("'%s' will be ignored for %s '%s' (requires 'option httpchk').\n", - "disable-on-404", proxy_type_str(px), px->id); - *err_code |= ERR_WARN; - px->options &= ~PR_O_DISABLE404; - } - if (px->options2 & PR_O2_CHK_SNDST) { - ha_warning("'%s' will be ignored for %s '%s' (requires 'option httpchk').\n", - "send-state", proxy_type_str(px), px->id); - *err_code |= ERR_WARN; - px->options2 &= ~PR_O2_CHK_SNDST; - } - } - if ((px->options2 & PR_O2_CHK_ANY) == PR_O2_EXT_CHK) { if (!global.external_check) { ha_alert("Proxy '%s' : '%s' unable to find required 'global.external-check'.\n", diff --git a/src/server.c b/src/server.c index aaa04abfe..1dcf62841 100644 --- a/src/server.c +++ b/src/server.c @@ -6686,12 +6686,16 @@ int srv_apply_track(struct server *srv, struct proxy *curproxy) return 1; } - if (curproxy != px && - (curproxy->options & PR_O_DISABLE404) != (px->options & PR_O_DISABLE404)) { - ha_alert("unable to use %s/%s for" - "tracking: disable-on-404 option inconsistency.\n", - px->id, strack->id); - return 1; + if (curproxy != px) { + int val1 = curproxy->tcpcheck.rs && (curproxy->tcpcheck.rs->flags & TCPCHK_RULES_DISABLE404); + int val2 = px->tcpcheck.rs && (px->tcpcheck.rs->flags & TCPCHK_RULES_DISABLE404); + + if (val1 != val2) { + ha_alert("unable to use %s/%s for" + "tracking: disable-on-404 option inconsistency.\n", + px->id, strack->id); + return 1; + } } srv->track = strack; diff --git a/src/tcpcheck.c b/src/tcpcheck.c index 584486048..57b13b415 100644 --- a/src/tcpcheck.c +++ b/src/tcpcheck.c @@ -1781,7 +1781,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_send(struct check *check, struct tcpcheck_r } } - if (check->proxy->options2 & PR_O2_CHK_SNDST) { + if (check->tcpcheck->rs->flags & TCPCHK_RULES_SNDST) { chunk_reset(tmp); httpchk_build_status_header(check->server, tmp); if (!htx_add_header(htx, ist("X-Haproxy-Server-State"), ist2(b_orig(tmp), b_data(tmp)))) @@ -2005,7 +2005,7 @@ enum tcpcheck_eval_ret tcpcheck_eval_expect_http(struct check *check, struct tcp check->code = sl->info.res.status; if (check->server && - (check->server->proxy->options & PR_O_DISABLE404) && + (check->tcpcheck->rs->flags & TCPCHK_RULES_DISABLE404) && (check->server->next_state != SRV_ST_STOPPED) && (check->code == 404)) { /* 404 may be accepted as "stopping" only if the server was up */ @@ -2611,7 +2611,7 @@ int tcpcheck_main(struct check *check) enum healthcheck_status status; if (check->server && - (check->server->proxy->options & PR_O_DISABLE404) && + (check->tcpcheck->rs->flags & TCPCHK_RULES_DISABLE404) && (check->server->next_state != SRV_ST_STOPPED) && (check->code == 404)) { set_server_check_status(check, HCHK_STATUS_L7OKCD, NULL); @@ -4350,22 +4350,6 @@ static int proxy_parse_httpcheck(char **args, int section, struct proxy *curpx, if (warnifnotcap(curpx, PR_CAP_BE, file, line, args[0], NULL)) ret = 1; - cur_arg = 1; - if (strcmp(args[cur_arg], "disable-on-404") == 0) { - /* enable a graceful server shutdown on an HTTP 404 response */ - curpx->options |= PR_O_DISABLE404; - if (too_many_args(1, args, errmsg, NULL)) - goto error; - goto out; - } - else if (strcmp(args[cur_arg], "send-state") == 0) { - /* enable emission of the apparent state of a server in HTTP checks */ - curpx->options2 |= PR_O2_CHK_SNDST; - if (too_many_args(1, args, errmsg, NULL)) - goto error; - goto out; - } - /* Deduce the ruleset name from the proxy info */ chunk_printf(&trash, "*http-check-%s_%s-%d", ((curpx == defpx) ? "defaults" : curpx->id), @@ -4380,6 +4364,21 @@ static int proxy_parse_httpcheck(char **args, int section, struct proxy *curpx, } rs->flags |= TCPCHK_RULES_HTTP_CHK; } + cur_arg = 1; + if (strcmp(args[cur_arg], "disable-on-404") == 0) { + /* enable a graceful server shutdown on an HTTP 404 response */ + rs->flags |= TCPCHK_RULES_DISABLE404; + if (too_many_args(1, args, errmsg, NULL)) + goto error; + goto out; + } + else if (strcmp(args[cur_arg], "send-state") == 0) { + /* enable emission of the apparent state of a server in HTTP checks */ + rs->flags |= TCPCHK_RULES_SNDST; + if (too_many_args(1, args, errmsg, NULL)) + goto error; + goto out; + } index = 0; if (!LIST_ISEMPTY(&rs->rules)) {