chiark / gitweb /
service: make start jobs wait, not fail, when an automatic restart is queued
authorLennart Poettering <lennart@poettering.net>
Wed, 18 Jul 2012 00:28:08 +0000 (02:28 +0200)
committerLennart Poettering <lennart@poettering.net>
Wed, 18 Jul 2012 00:28:08 +0000 (02:28 +0200)
When an automatic restart is already queued, then make subsequent start
jobs wait until the restart can be handled (i.e. after the holdhoff
time), instead of simply fail.

TODO
src/core/service.c

diff --git a/TODO b/TODO
index 86a2463..172c35b 100644 (file)
--- a/TODO
+++ b/TODO
@@ -36,10 +36,6 @@ Features:
 
 * syscall filter: add knowledge about compat syscalls
 
-* flush jobs when switching root
-
-* autorestart of journald after switch-root is broken
-
 * logind: wakelock/opportunistic suspend support
 
 * switch-root: sockets need relabelling
@@ -56,8 +52,6 @@ Features:
 
 * refuse taking lower-case variable names in sd_journal_send() and friends.
 
-* when running as user instance: implicitly default to WorkingDirectory=$HOME for all services.
-
 * Merge KillUnit()'s mode and who params into one
 
 * load-fragment: when loading a unit file via a chain of symlinks
@@ -101,8 +95,6 @@ Features:
 
 * change Requires=basic.target to RequisiteOverride=basic.target
 
-* exclude processes marked with argv[0][0]=@ from the normal service killing too
-
 * support rd.luks.allow-discards= kernel cmdline params in cryptsetup generator
 
 * systemctl: when stopping a service which has triggres and warning about it actually check the TriggeredBy= deps fields
index 7a7e25f..cf480ab 100644 (file)
@@ -2258,10 +2258,12 @@ static void service_enter_restart(Service *s) {
         assert(s);
         dbus_error_init(&error);
 
-        if (UNIT(s)->job) {
-                log_info("Job pending for unit, delaying automatic restart.");
+        if (UNIT(s)->job && UNIT(s)->job->type == JOB_STOP) {
+                /* Don't restart things if we are going down anyway */
+                log_info("Stop job pending for unit, delaying automatic restart.");
 
-                if ((r = unit_watch_timer(UNIT(s), s->restart_usec, &s->timer_watch)) < 0)
+                r = unit_watch_timer(UNIT(s), s->restart_usec, &s->timer_watch);
+                if (r < 0)
                         goto fail;
 
                 return;
@@ -2275,6 +2277,10 @@ static void service_enter_restart(Service *s) {
         if (r < 0)
                 goto fail;
 
+        /* Note that we stay in the SERVICE_AUTO_RESTART state here,
+         * it will be canceled as part of the service_stop() call that
+         * is executed as part of JOB_RESTART. */
+
         log_debug("%s scheduled restart job.", UNIT(s)->id);
         return;
 
@@ -2473,7 +2479,7 @@ static int service_start(Unit *u) {
          * service should be manually restarted, not started. */
         if (s->state == SERVICE_AUTO_RESTART) {
                 log_warning("%s automatic restart is pending, must be stopped before issuing start request.", UNIT(s)->id);
-                return -ECANCELED;
+                return -EAGAIN;
         }
 
         assert(s->state == SERVICE_DEAD || s->state == SERVICE_FAILED);