From 4288b79f23248e64f182bad5273e084b28680f69 Mon Sep 17 00:00:00 2001 From: Christian Brauner Date: Thu, 3 Aug 2017 23:55:23 +0200 Subject: [PATCH] start: ensure cgroups are cleaned up When a container is marked as being in STOPPED state it is possible for another thread to start it again even though not all cleanup operations for that container have finished. This is not a problem for most things like sockets and friends which are unique to the container. It is however a problem for cgroups which are named after that container in that we cause our cgroup driver to waste cpu cycles finding a new cgroup name. Closes #1726. Signed-off-by: Christian Brauner --- src/lxc/start.c | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/src/lxc/start.c b/src/lxc/start.c index d2a054bfc..a360f784c 100644 --- a/src/lxc/start.c +++ b/src/lxc/start.c @@ -720,8 +720,14 @@ void lxc_fini(const char *name, struct lxc_handler *handler) handler->netnsfd = -1; } + cgroup_destroy(handler); + lxc_set_state(name, handler, STOPPED); + /* close command socket */ + close(handler->conf->maincmd_fd); + handler->conf->maincmd_fd = -1; + if (run_lxc_hooks(name, "post-stop", handler->conf, handler->lxcpath, NULL)) { ERROR("Failed to run lxc.hook.post-stop for container \"%s\".", name); if (handler->conf->reboot) { @@ -739,10 +745,6 @@ void lxc_fini(const char *name, struct lxc_handler *handler) lxc_console_delete(&handler->conf->console); lxc_delete_tty(&handler->conf->tty_info); - /* close the command socket */ - close(handler->conf->maincmd_fd); - handler->conf->maincmd_fd = -1; - /* The command socket is now closed, no more state clients can register * themselves from now on. So free the list of state clients. */ @@ -755,7 +757,6 @@ void lxc_fini(const char *name, struct lxc_handler *handler) free(cur); } - free(handler->name); if (handler->ttysock[0] != -1) { close(handler->ttysock[0]); close(handler->ttysock[1]); @@ -764,7 +765,7 @@ void lxc_fini(const char *name, struct lxc_handler *handler) if (handler->conf->ephemeral == 1 && handler->conf->reboot != 1) lxc_destroy_container_on_signal(handler, name); - cgroup_destroy(handler); + free(handler->name); free(handler); } -- 2.47.2