1 /*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
4 This file is part of systemd.
6 Copyright 2010 Lennart Poettering
8 systemd is free software; you can redistribute it and/or modify it
9 under the terms of the GNU Lesser General Public License as published by
10 the Free Software Foundation; either version 2.1 of the License, or
11 (at your option) any later version.
13 systemd is distributed in the hope that it will be useful, but
14 WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 Lesser General Public License for more details.
18 You should have received a copy of the GNU Lesser General Public License
19 along with systemd; If not, see <http://www.gnu.org/licenses/>.
24 #include <sys/timerfd.h>
25 #include <sys/epoll.h>
31 #include "load-fragment.h"
32 #include "load-dropin.h"
36 Job* job_new(Unit *unit, JobType type) {
39 assert(type < _JOB_TYPE_MAX);
42 if (!(j = new0(Job, 1)))
45 j->manager = unit->manager;
46 j->id = j->manager->current_job_id++;
50 j->timer_watch.type = WATCH_INVALID;
52 /* We don't link it here, that's what job_dependency() is for */
57 void job_free(Job *j) {
59 assert(!j->installed);
60 assert(!j->transaction_prev);
61 assert(!j->transaction_next);
62 assert(!j->subject_list);
63 assert(!j->object_list);
66 LIST_REMOVE(Job, run_queue, j->manager->run_queue, j);
69 LIST_REMOVE(Job, dbus_queue, j->manager->dbus_job_queue, j);
71 if (j->timer_watch.type != WATCH_INVALID) {
72 assert(j->timer_watch.type == WATCH_JOB_TIMER);
73 assert(j->timer_watch.data.job == j);
74 assert(j->timer_watch.fd >= 0);
76 assert_se(epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_DEL, j->timer_watch.fd, NULL) >= 0);
77 close_nointr_nofail(j->timer_watch.fd);
84 void job_uninstall(Job *j) {
86 assert(j->unit->job == j);
87 /* Detach from next 'bigger' objects */
89 bus_job_send_removed_signal(j);
92 unit_add_to_gc_queue(j->unit);
94 hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
98 static bool job_type_allows_late_merge(JobType t) {
99 /* Tells whether it is OK to merge a job of type 't' with an already
101 * Reloads cannot be merged this way. Think of the sequence:
102 * 1. Reload of a daemon is in progress; the daemon has already loaded
103 * its config file, but hasn't completed the reload operation yet.
104 * 2. Edit foo's config file.
105 * 3. Trigger another reload to have the daemon use the new config.
106 * Should the second reload job be merged into the first one, the daemon
107 * would not know about the new config.
108 * JOB_RESTART jobs on the other hand can be merged, because they get
109 * patched into JOB_START after stopping the unit. So if we see a
110 * JOB_RESTART running, it means the unit hasn't stopped yet and at
111 * this time the merge is still allowed. */
112 return !(t == JOB_RELOAD || t == JOB_RELOAD_OR_START);
115 static void job_merge_into_installed(Job *j, Job *other) {
116 assert(j->installed);
117 assert(j->unit == other->unit);
119 j->type = job_type_lookup_merge(j->type, other->type);
120 assert(j->type >= 0);
122 j->override = j->override || other->override;
125 Job* job_install(Job *j) {
126 Job *uj = j->unit->job;
128 assert(!j->installed);
131 if (job_type_is_conflicting(uj->type, j->type))
132 job_finish_and_invalidate(uj, JOB_CANCELED);
134 /* not conflicting, i.e. mergeable */
136 if (uj->state == JOB_WAITING ||
137 (job_type_allows_late_merge(j->type) && job_type_is_superset(uj->type, j->type))) {
138 job_merge_into_installed(uj, j);
139 log_debug("Merged into installed job %s/%s as %u",
140 uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
143 /* already running and not safe to merge into */
144 /* Patch uj to become a merged job and re-run it. */
145 /* XXX It should be safer to queue j to run after uj finishes, but it is
146 * not currently possible to have more than one installed job per unit. */
147 job_merge_into_installed(uj, j);
148 log_debug("Merged into running job, re-running: %s/%s as %u",
149 uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
150 uj->state = JOB_WAITING;
156 /* Install the job */
159 j->manager->n_installed_jobs ++;
160 log_debug("Installed new job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
164 JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts) {
169 /* Adds a new job link, which encodes that the 'subject' job
170 * needs the 'object' job in some way. If 'subject' is NULL
171 * this means the 'anchor' job (i.e. the one the user
172 * explicitly asked for) is the requester. */
174 if (!(l = new0(JobDependency, 1)))
177 l->subject = subject;
179 l->matters = matters;
180 l->conflicts = conflicts;
183 LIST_PREPEND(JobDependency, subject, subject->subject_list, l);
185 LIST_PREPEND(JobDependency, object, object->object_list, l);
190 void job_dependency_free(JobDependency *l) {
194 LIST_REMOVE(JobDependency, subject, l->subject->subject_list, l);
196 LIST_REMOVE(JobDependency, object, l->object->object_list, l);
201 void job_dump(Job *j, FILE*f, const char *prefix) {
210 "%s\tAction: %s -> %s\n"
214 prefix, j->unit->id, job_type_to_string(j->type),
215 prefix, job_state_to_string(j->state),
216 prefix, yes_no(j->override));
220 * Merging is commutative, so imagine the matrix as symmetric. We store only
221 * its lower triangle to avoid duplication. We don't store the main diagonal,
222 * because A merged with A is simply A.
224 * Merging is associative! A merged with B merged with C is the same as
225 * A merged with C merged with B.
227 * Mergeability is transitive! If A can be merged with B and B with C then
230 * Also, if A merged with B cannot be merged with C, then either A or B cannot
231 * be merged with C either.
233 static const JobType job_merging_table[] = {
234 /* What \ With * JOB_START JOB_VERIFY_ACTIVE JOB_STOP JOB_RELOAD JOB_RELOAD_OR_START JOB_RESTART JOB_TRY_RESTART */
235 /************************************************************************************************************************************/
237 /*JOB_VERIFY_ACTIVE */ JOB_START,
238 /*JOB_STOP */ -1, -1,
239 /*JOB_RELOAD */ JOB_RELOAD_OR_START, JOB_RELOAD, -1,
240 /*JOB_RELOAD_OR_START*/ JOB_RELOAD_OR_START, JOB_RELOAD_OR_START, -1, JOB_RELOAD_OR_START,
241 /*JOB_RESTART */ JOB_RESTART, JOB_RESTART, -1, JOB_RESTART, JOB_RESTART,
242 /*JOB_TRY_RESTART */ JOB_RESTART, JOB_TRY_RESTART, -1, JOB_TRY_RESTART, JOB_RESTART, JOB_RESTART,
245 JobType job_type_lookup_merge(JobType a, JobType b) {
246 assert_cc(ELEMENTSOF(job_merging_table) == _JOB_TYPE_MAX * (_JOB_TYPE_MAX - 1) / 2);
247 assert(a >= 0 && a < _JOB_TYPE_MAX);
248 assert(b >= 0 && b < _JOB_TYPE_MAX);
259 return job_merging_table[(a - 1) * a / 2 + b];
262 bool job_type_is_redundant(JobType a, UnitActiveState b) {
272 b == UNIT_INACTIVE ||
275 case JOB_VERIFY_ACTIVE:
284 case JOB_RELOAD_OR_START:
286 b == UNIT_ACTIVATING ||
291 b == UNIT_ACTIVATING;
293 case JOB_TRY_RESTART:
295 b == UNIT_ACTIVATING;
298 assert_not_reached("Invalid job type");
302 bool job_is_runnable(Job *j) {
307 assert(j->installed);
309 /* Checks whether there is any job running for the units this
310 * job needs to be running after (in the case of a 'positive'
311 * job type) or before (in the case of a 'negative' job
314 /* First check if there is an override */
318 if (j->type == JOB_START ||
319 j->type == JOB_VERIFY_ACTIVE ||
320 j->type == JOB_RELOAD ||
321 j->type == JOB_RELOAD_OR_START) {
323 /* Immediate result is that the job is or might be
324 * started. In this case lets wait for the
325 * dependencies, regardless whether they are
326 * starting or stopping something. */
328 SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i)
333 /* Also, if something else is being stopped and we should
334 * change state after it, then lets wait. */
336 SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i)
338 (other->job->type == JOB_STOP ||
339 other->job->type == JOB_RESTART ||
340 other->job->type == JOB_TRY_RESTART))
343 /* This means that for a service a and a service b where b
344 * shall be started after a:
346 * start a + start b → 1st step start a, 2nd step start b
347 * start a + stop b → 1st step stop b, 2nd step start a
348 * stop a + start b → 1st step stop a, 2nd step start b
349 * stop a + stop b → 1st step stop b, 2nd step stop a
351 * This has the side effect that restarts are properly
352 * synchronized too. */
357 static void job_change_type(Job *j, JobType newtype) {
358 log_debug("Converting job %s/%s -> %s/%s",
359 j->unit->id, job_type_to_string(j->type),
360 j->unit->id, job_type_to_string(newtype));
365 int job_run_and_invalidate(Job *j) {
371 assert(j->installed);
373 if (j->in_run_queue) {
374 LIST_REMOVE(Job, run_queue, j->manager->run_queue, j);
375 j->in_run_queue = false;
378 if (j->state != JOB_WAITING)
381 if (!job_is_runnable(j))
384 j->state = JOB_RUNNING;
385 job_add_to_dbus_queue(j);
387 /* While we execute this operation the job might go away (for
388 * example: because it is replaced by a new, conflicting
389 * job.) To make sure we don't access a freed job later on we
390 * store the id here, so that we can verify the job is still
397 case JOB_RELOAD_OR_START:
398 if (unit_active_state(j->unit) == UNIT_ACTIVE) {
399 job_change_type(j, JOB_RELOAD);
400 r = unit_reload(j->unit);
403 job_change_type(j, JOB_START);
407 r = unit_start(j->unit);
409 /* If this unit cannot be started, then simply wait */
414 case JOB_VERIFY_ACTIVE: {
415 UnitActiveState t = unit_active_state(j->unit);
416 if (UNIT_IS_ACTIVE_OR_RELOADING(t))
418 else if (t == UNIT_ACTIVATING)
425 case JOB_TRY_RESTART:
426 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(j->unit))) {
430 job_change_type(j, JOB_RESTART);
435 r = unit_stop(j->unit);
437 /* If this unit cannot stopped, then simply wait. */
443 r = unit_reload(j->unit);
447 assert_not_reached("Unknown job type");
450 if ((j = manager_get_job(m, id))) {
452 r = job_finish_and_invalidate(j, JOB_DONE);
453 else if (r == -ENOEXEC)
454 r = job_finish_and_invalidate(j, JOB_SKIPPED);
455 else if (r == -EAGAIN)
456 j->state = JOB_WAITING;
458 r = job_finish_and_invalidate(j, JOB_FAILED);
464 static void job_print_status_message(Unit *u, JobType t, JobResult result) {
467 if (t == JOB_START) {
472 if (u->condition_result)
473 unit_status_printf(u, ANSI_HIGHLIGHT_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, "Started %s", unit_description(u));
477 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON "FAILED" ANSI_HIGHLIGHT_OFF, "Failed to start %s", unit_description(u));
478 unit_status_printf(u, NULL, "See 'systemctl status %s' for details.", u->id);
482 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " ABORT" ANSI_HIGHLIGHT_OFF, "Dependency failed. Aborted start of %s", unit_description(u));
486 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF, "Timed out starting %s", unit_description(u));
493 } else if (t == JOB_STOP) {
498 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF, "Timed out stopping %s", unit_description(u));
503 unit_status_printf(u, ANSI_HIGHLIGHT_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, "Stopped %s", unit_description(u));
512 int job_finish_and_invalidate(Job *j, JobResult result) {
517 bool recursed = false;
520 assert(j->installed);
522 job_add_to_dbus_queue(j);
524 /* Patch restart jobs so that they become normal start jobs */
525 if (result == JOB_DONE && j->type == JOB_RESTART) {
527 job_change_type(j, JOB_START);
528 j->state = JOB_WAITING;
530 job_add_to_run_queue(j);
538 log_debug("Job %s/%s finished, result=%s", j->unit->id, job_type_to_string(j->type), job_result_to_string(result));
540 if (result == JOB_FAILED)
541 j->manager->n_failed_jobs ++;
548 job_print_status_message(u, t, result);
550 /* Fail depending jobs on failure */
551 if (result != JOB_DONE) {
553 if (t == JOB_START ||
554 t == JOB_VERIFY_ACTIVE ||
555 t == JOB_RELOAD_OR_START) {
557 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
559 (other->job->type == JOB_START ||
560 other->job->type == JOB_VERIFY_ACTIVE ||
561 other->job->type == JOB_RELOAD_OR_START)) {
562 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
566 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
568 (other->job->type == JOB_START ||
569 other->job->type == JOB_VERIFY_ACTIVE ||
570 other->job->type == JOB_RELOAD_OR_START)) {
571 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
575 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
577 !other->job->override &&
578 (other->job->type == JOB_START ||
579 other->job->type == JOB_VERIFY_ACTIVE ||
580 other->job->type == JOB_RELOAD_OR_START)) {
581 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
585 } else if (t == JOB_STOP) {
587 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
589 (other->job->type == JOB_START ||
590 other->job->type == JOB_VERIFY_ACTIVE ||
591 other->job->type == JOB_RELOAD_OR_START)) {
592 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
598 /* Trigger OnFailure dependencies that are not generated by
599 * the unit itself. We don't tread JOB_CANCELED as failure in
600 * this context. And JOB_FAILURE is already handled by the
602 if (result == JOB_TIMEOUT || result == JOB_DEPENDENCY) {
603 log_notice("Job %s/%s failed with result '%s'.",
605 job_type_to_string(t),
606 job_result_to_string(result));
608 unit_trigger_on_failure(u);
612 /* Try to start the next jobs that can be started */
613 SET_FOREACH(other, u->dependencies[UNIT_AFTER], i)
615 job_add_to_run_queue(other->job);
616 SET_FOREACH(other, u->dependencies[UNIT_BEFORE], i)
618 job_add_to_run_queue(other->job);
620 manager_check_finished(u->manager);
625 int job_start_timer(Job *j) {
626 struct itimerspec its;
627 struct epoll_event ev;
631 if (j->unit->job_timeout <= 0 ||
632 j->timer_watch.type == WATCH_JOB_TIMER)
635 assert(j->timer_watch.type == WATCH_INVALID);
637 if ((fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC)) < 0) {
643 timespec_store(&its.it_value, j->unit->job_timeout);
645 if (timerfd_settime(fd, 0, &its, NULL) < 0) {
651 ev.data.ptr = &j->timer_watch;
654 if (epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
659 j->timer_watch.type = WATCH_JOB_TIMER;
660 j->timer_watch.fd = fd;
661 j->timer_watch.data.job = j;
667 close_nointr_nofail(fd);
672 void job_add_to_run_queue(Job *j) {
674 assert(j->installed);
679 LIST_PREPEND(Job, run_queue, j->manager->run_queue, j);
680 j->in_run_queue = true;
683 void job_add_to_dbus_queue(Job *j) {
685 assert(j->installed);
687 if (j->in_dbus_queue)
690 /* We don't check if anybody is subscribed here, since this
691 * job might just have been created and not yet assigned to a
692 * connection/client. */
694 LIST_PREPEND(Job, dbus_queue, j->manager->dbus_job_queue, j);
695 j->in_dbus_queue = true;
698 char *job_dbus_path(Job *j) {
703 if (asprintf(&p, "/org/freedesktop/systemd1/job/%lu", (unsigned long) j->id) < 0)
709 void job_timer_event(Job *j, uint64_t n_elapsed, Watch *w) {
711 assert(w == &j->timer_watch);
713 log_warning("Job %s/%s timed out.", j->unit->id, job_type_to_string(j->type));
714 job_finish_and_invalidate(j, JOB_TIMEOUT);
717 static const char* const job_state_table[_JOB_STATE_MAX] = {
718 [JOB_WAITING] = "waiting",
719 [JOB_RUNNING] = "running"
722 DEFINE_STRING_TABLE_LOOKUP(job_state, JobState);
724 static const char* const job_type_table[_JOB_TYPE_MAX] = {
725 [JOB_START] = "start",
726 [JOB_VERIFY_ACTIVE] = "verify-active",
728 [JOB_RELOAD] = "reload",
729 [JOB_RELOAD_OR_START] = "reload-or-start",
730 [JOB_RESTART] = "restart",
731 [JOB_TRY_RESTART] = "try-restart",
734 DEFINE_STRING_TABLE_LOOKUP(job_type, JobType);
736 static const char* const job_mode_table[_JOB_MODE_MAX] = {
738 [JOB_REPLACE] = "replace",
739 [JOB_ISOLATE] = "isolate",
740 [JOB_IGNORE_DEPENDENCIES] = "ignore-dependencies",
741 [JOB_IGNORE_REQUIREMENTS] = "ignore-requirements"
744 DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);
746 static const char* const job_result_table[_JOB_RESULT_MAX] = {
748 [JOB_CANCELED] = "canceled",
749 [JOB_TIMEOUT] = "timeout",
750 [JOB_FAILED] = "failed",
751 [JOB_DEPENDENCY] = "dependency",
752 [JOB_SKIPPED] = "skipped"
755 DEFINE_STRING_TABLE_LOOKUP(job_result, JobResult);