chiark / gitweb /
job: also trigger on-failure dependencies when jobs faile due to dependencies, timeout
[elogind.git] / src / job.c
index 53c47d4a724fe8388f4878c0fa83596a7fbf1e25..46577fdf7a199384b50da6c19fd34e46c3feb4f1 100644 (file)
--- a/src/job.c
+++ b/src/job.c
@@ -461,8 +461,6 @@ int job_run_and_invalidate(Job *j) {
                         j->state = JOB_WAITING;
                 else if (r < 0)
                         r = job_finish_and_invalidate(j, JOB_FAILED);
-                else
-                        job_start_timer(j);
         }
 
         return r;
@@ -504,11 +502,11 @@ int job_finish_and_invalidate(Job *j, JobResult result) {
         t = j->type;
         job_free(j);
 
-        if (result == JOB_FAILED && j->type == JOB_START)
+        if (result == JOB_FAILED && t == JOB_START)
                 unit_status_printf(u, "Starting %s " ANSI_HIGHLIGHT_ON "failed" ANSI_HIGHLIGHT_OFF ", see 'systemctl status %s' for details.\n", unit_description(u), u->meta.id);
-        else if (result == JOB_TIMEOUT && j->type == JOB_START)
+        else if (result == JOB_TIMEOUT && t == JOB_START)
                 unit_status_printf(u, "Starting %s " ANSI_HIGHLIGHT_ON "timed out" ANSI_HIGHLIGHT_OFF ".\n", unit_description(u), u->meta.id);
-        else if (result == JOB_TIMEOUT && j->type == JOB_STOP)
+        else if (result == JOB_TIMEOUT && t == JOB_STOP)
                 unit_status_printf(u, "Stopping %s " ANSI_HIGHLIGHT_ON "timed out" ANSI_HIGHLIGHT_OFF ".\n", unit_description(u), u->meta.id);
 
         /* Fail depending jobs on failure */
@@ -551,6 +549,13 @@ int job_finish_and_invalidate(Job *j, JobResult result) {
                 }
         }
 
+        /* Trigger OnFailure dependencies that are not generated by
+         * the unit itself. We don't tread JOB_CANCELED as failure in
+         * this context. And JOB_FAILURE is already handled by the
+         * unit itself. */
+        if (result == JOB_TIMEOUT || result == JOB_DEPENDENCY)
+                unit_trigger_on_failure(u);
+
         /* Try to start the next jobs that can be started */
         SET_FOREACH(other, u->meta.dependencies[UNIT_AFTER], i)
                 if (other->meta.job)