summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDonald Buczek <buczek@molgen.mpg.de>2019-04-25 09:39:41 +0200
committerLennart Poettering <lennart@poettering.net>2019-06-20 10:16:53 +0200
commit0219b3524f414e23589e63c6de6a759811ef8474 (patch)
tree30c7f141bd812931fdeb7f6349e9f6205b461214
parentb19eab1f74f5105fc5737b3790071175ea1a9292 (diff)
downloadsystemd-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.c11
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;