]> git.ipfire.org Git - thirdparty/haproxy.git/commitdiff
BUG/MEDIUM: namespace: close open namespaces during soft shutdown
authorKrisztian Kovacs <krisztian.kovacs@oneidentity.com>
Tue, 24 Sep 2019 12:12:13 +0000 (14:12 +0200)
committerWilly Tarreau <w@1wt.eu>
Wed, 25 Sep 2019 21:33:52 +0000 (23:33 +0200)
When doing a soft shutdown, we won't be making new connections anymore so
there's no point in keeping the namespace file descriptors open anymore.

Keeping these open effectively makes it impossible to properly clean up
namespaces which are no longer used in the new configuration until all
previously opened connections are closed in the old worker process.

This change introduces a cleanup function that is called during soft shutdown
that closes all namespace file descriptors by iterating over the namespace
ebtree.

src/namespace.c

index cfb81ba0f928a2ed281945af805b62e3f90f5ee7..f23da48f80cbe376e18604f47a2d98a5db4179aa 100644 (file)
@@ -15,6 +15,7 @@
 #include <common/hash.h>
 #include <common/errors.h>
 #include <proto/log.h>
+#include <proto/signal.h>
 #include <types/global.h>
 
 /* Opens the namespace <ns_name> and returns the FD or -1 in case of error
@@ -39,6 +40,24 @@ static int init_default_namespace()
 
 static struct eb_root namespace_tree_root = EB_ROOT;
 
+static void netns_sig_stop(struct sig_handler *sh)
+{
+       struct ebpt_node *node, *next;
+       struct netns_entry *entry;
+
+       /* close namespace file descriptors and remove registered namespaces from the
+        * tree when stopping */
+       node = ebpt_first(&namespace_tree_root);
+       while (node) {
+               next = ebpt_next(node);
+               ebpt_delete(node);
+               entry = container_of(node, struct netns_entry, node);
+               free(entry->node.key);
+               close(entry->fd);
+               node = next;
+       }
+}
+
 int netns_init(void)
 {
        int err_code = 0;
@@ -55,6 +74,8 @@ int netns_init(void)
                }
        }
 
+       signal_register_fct(0, netns_sig_stop, 0);
+
        return err_code;
 }