chiark / gitweb /
core: don't wait for non-control/non-main processes when killing processes on the...
authorLennart Poettering <lennart@poettering.net>
Wed, 5 Feb 2014 01:22:11 +0000 (02:22 +0100)
committerLennart Poettering <lennart@poettering.net>
Wed, 5 Feb 2014 01:22:11 +0000 (02:22 +0100)
Since the current kernel cgroup notification logic is easily confused by
existing subgroups, let's do the same thing as in containers before. and
just not wait for non-control and non-main processes.

This should be corrected as soon as we have sane cgroup notifications
from the kernel.

src/core/unit.c

index 78d7b53..63576a4 100644 (file)
@@ -2979,15 +2979,17 @@ int unit_kill_context(
                                 log_warning_unit(u->id, "Failed to kill control group: %s", strerror(-r));
                 } else if (r > 0) {
 
-                        /* FIXME: Now, this is a terrible hack: in
-                         * containers cgroup empty notifications don't
-                         * work. Hence we'll not wait for them to run
-                         * empty for now, since there is no way to
-                         * detect when a service ends with no main PID
-                         * known... */
-
-                        if (detect_container(NULL) <= 0)
-                                wait_for_exit = true;
+                        /* FIXME: Now, we don't actually wait for any
+                         * of the processes that are neither control
+                         * nor main process. We should wait for them
+                         * of course, but that's hard since the cgroup
+                         * notification logic is so unreliable. It is
+                         * not available at all in containers, and on
+                         * the host it gets confused by
+                         * subgroups. Hence, for now, let's not wait
+                         * for these processes -- but when the kernel
+                         * gets fixed we really should correct
+                         * that. */
 
                         if (c->send_sighup) {
                                 set_free(pid_set);