From: Amaury Denoyelle Date: Fri, 17 Jul 2026 08:19:36 +0000 (+0200) Subject: MINOR: proxy: keep default-server unless empty setting X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=3f0736468586564cbc15a5b30fb308a2746ef7ef;p=thirdparty%2Fhaproxy.git MINOR: proxy: keep default-server unless empty setting Previously, default-server were removed as soon as a proxy section parsing was over. This patch changes this behavior to now keep default-server during haproxy runtime. This will allow to reuse them for dynamic servers, which will be later implemented via "from" keyword as a distinct feature. Default-server may consume a noticeable amount of memory, so it can still be desirable to clean up these elements on post-parsing. Thus, if a default-server is reset, it will still be purged on section post parsing. This can be achived by using a "default-server from none" final line. To detect if a default-server should be preserved, a new flag SRV_F_UMODIFIED has been defined. Such flag is set as soon as a server keyword has been parsed. It is reset when srv_settings_init() is used. Thus, if this flag is present, default-server purge on post parsing is skipped. --- diff --git a/include/haproxy/server-t.h b/include/haproxy/server-t.h index a7dfd6de0..6e6288a21 100644 --- a/include/haproxy/server-t.h +++ b/include/haproxy/server-t.h @@ -175,6 +175,7 @@ enum srv_init_state { #define SRV_F_CHK_NO_AUTO_SNI 0x20000 /* disable automatic SNI selection for healthcheck */ #define SRV_F_UDP_GSO_NOTSUPP 0x40000 /* UDP GSO is disabled due to a previous error encountered */ #define SRV_F_NAME_REFD 0x80000 /* this server's name is statically referenced (use-server, track, sample arg) */ +#define SRV_F_UMODIFIED 0x100000 /* at least one setting has been explicitely set via a server keyword */ /* configured server options for send-proxy (server->pp_opts) */ #define SRV_PP_V1 0x0001 /* proxy protocol version 1 */ diff --git a/src/proxy.c b/src/proxy.c index 5d81c0918..9c80a636f 100644 --- a/src/proxy.c +++ b/src/proxy.c @@ -4321,13 +4321,13 @@ static int post_section_px_cleanup() { if (!curproxy) return 0; // nothing to do - if ((curproxy->cap & PR_CAP_LISTEN) && !(curproxy->cap & PR_CAP_DEF)) { - /* This is a regular proxy (not defaults). It doesn't need - * to keep a default-server section if it still had one. We - * want to keep it for defaults however, obviously. - */ - if (curproxy->defsrv) { + /* Perform clean up of empty default-server in proxies. This is not + * executed for defaults section as this may still be useful. + */ + if ((curproxy->cap & PR_CAP_LISTEN) && !(curproxy->cap & PR_CAP_DEF)) { + /* Default-server is removed if it does not define specific setting. */ + if (curproxy->defsrv && !(curproxy->defsrv->flags & SRV_F_UMODIFIED)) { srv_free_params(curproxy->defsrv); srv_free(&curproxy->defsrv); } diff --git a/src/server.c b/src/server.c index 56639185f..d9140556f 100644 --- a/src/server.c +++ b/src/server.c @@ -2885,6 +2885,9 @@ int srv_prepare_for_resolution(struct server *srv, const char *hostname) */ void srv_settings_init(struct server *srv) { + /* Mark server as reset. A default-server will be purged on post parsing. */ + srv->flags &= ~SRV_F_UMODIFIED; + srv->check.inter = DEF_CHKINTR; srv->check.fastinter = 0; srv->check.downinter = 0; @@ -4218,6 +4221,11 @@ int parse_server(const char *file, int linenum, char **args, parse_flags); if (err_code & ERR_FATAL) goto out; + + /* Mark server as modified by a keyword. Prevents a + * default-server to be purged on post parsing. + */ + newsrv->flags |= SRV_F_UMODIFIED; } if (!(parse_flags & SRV_PARSE_DEFAULT_SERVER)) {