Skip to content

Commit

Permalink
start: ensure cgroups are cleaned up
Browse files Browse the repository at this point in the history
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 <christian.brauner@ubuntu.com>
  • Loading branch information
Christian Brauner authored and stgraber committed Aug 15, 2017
1 parent c7afc4f commit 87970fe
Showing 1 changed file with 7 additions and 6 deletions.
13 changes: 7 additions & 6 deletions src/lxc/start.c
Expand Up @@ -717,8 +717,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) {
Expand All @@ -736,10 +742,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.
*/
Expand All @@ -752,7 +754,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]);
Expand All @@ -761,7 +762,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);
}

Expand Down

0 comments on commit 87970fe

Please sign in to comment.