diff options
author | Donald Buczek <buczek@molgen.mpg.de> | 2019-04-25 09:39:41 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2019-06-20 10:16:53 +0200 |
commit | 0219b3524f414e23589e63c6de6a759811ef8474 (patch) | |
tree | 30c7f141bd812931fdeb7f6349e9f6205b461214 | |
parent | b19eab1f74f5105fc5737b3790071175ea1a9292 (diff) | |
download | systemd-0219b3524f414e23589e63c6de6a759811ef8474.tar.gz |
cgroup: Continue unit reset if cgroup is busy
When part of the cgroup hierarchy cannot be deleted (e.g. because there
are still processes in it), do not exit unit_prune_cgroup early, but
continue so that u->cgroup_realized is reset.
Log the known case of non-empty cgroups at debug level and other errors
at warning level.
Fixes https://github.com/systemd/systemd/issues/12386
-rw-r--r-- | src/core/cgroup.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/core/cgroup.c b/src/core/cgroup.c index 0c885d5744..7f6a22155b 100644 --- a/src/core/cgroup.c +++ b/src/core/cgroup.c @@ -2384,10 +2384,13 @@ void unit_prune_cgroup(Unit *u) { is_root_slice = unit_has_name(u, SPECIAL_ROOT_SLICE); r = cg_trim_everywhere(u->manager->cgroup_supported, u->cgroup_path, !is_root_slice); - if (r < 0) { - log_unit_debug_errno(u, r, "Failed to destroy cgroup %s, ignoring: %m", u->cgroup_path); - return; - } + if (r < 0) + /* One reason we could have failed here is, that the cgroup still contains a process. + * However, if the cgroup becomes removable at a later time, it might be removed when + * the containing slice is stopped. So even if we failed now, this unit shouldn't assume + * that the cgroup is still realized the next time it is started. Do not return early + * on error, continue cleanup. */ + log_unit_full(u, r == -EBUSY ? LOG_DEBUG : LOG_WARNING, r, "Failed to destroy cgroup %s, ignoring: %m", u->cgroup_path); if (is_root_slice) return; |