]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
MINOR: proxy: keep default-server unless empty setting
authorAmaury Denoyelle <adenoyelle@haproxy.com>
Fri, 17 Jul 2026 08:19:36 +0000 (10:19 +0200)
committerAmaury Denoyelle <adenoyelle@haproxy.com>
Mon, 3 Aug 2026 14:52:09 +0000 (16:52 +0200)
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.

include/haproxy/server-t.h
src/proxy.c
src/server.c

index a7dfd6de02b532277bdc2b793a8fbcd808beb8ff..6e6288a216629a0cf4962c12819a61bf8f3a5659 100644 (file)
@@ -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 */
index 5d81c0918872260cfff1eb8f81464c007b137d64..9c80a636f6c1a62adb1f62cae0c93a2294c74214 100644 (file)
@@ -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);
                }
index 56639185f24404a0e315f98da6bd9264cb99e357..d9140556fe5477d60c1e29aece1d81c84e3432b4 100644 (file)
@@ -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)) {