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 /* Detach from next 'bigger' objects */
88 bus_job_send_removed_signal(j);
90 if (j->unit->job == j) {
92 unit_add_to_gc_queue(j->unit);
95 hashmap_remove(j->manager->jobs, UINT32_TO_PTR(j->id));
99 static bool job_type_allows_late_merge(JobType t) {
100 /* Tells whether it is OK to merge a job of type 't' with an already
102 * Reloads cannot be merged this way. Think of the sequence:
103 * 1. Reload of a daemon is in progress; the daemon has already loaded
104 * its config file, but hasn't completed the reload operation yet.
105 * 2. Edit foo's config file.
106 * 3. Trigger another reload to have the daemon use the new config.
107 * Should the second reload job be merged into the first one, the daemon
108 * would not know about the new config.
109 * JOB_RESTART jobs on the other hand can be merged, because they get
110 * patched into JOB_START after stopping the unit. So if we see a
111 * JOB_RESTART running, it means the unit hasn't stopped yet and at
112 * this time the merge is still allowed. */
113 return !(t == JOB_RELOAD || t == JOB_RELOAD_OR_START);
116 static void job_merge_into_installed(Job *j, Job *other) {
117 assert(j->installed);
118 assert(j->unit == other->unit);
120 j->type = job_type_lookup_merge(j->type, other->type);
121 assert(j->type >= 0);
123 j->override = j->override || other->override;
126 Job* job_install(Job *j) {
127 Job *uj = j->unit->job;
129 assert(!j->installed);
132 if (job_type_is_conflicting(uj->type, j->type))
133 job_finish_and_invalidate(uj, JOB_CANCELED);
135 /* not conflicting, i.e. mergeable */
137 if (uj->state == JOB_WAITING ||
138 (job_type_allows_late_merge(j->type) && job_type_is_superset(uj->type, j->type))) {
139 job_merge_into_installed(uj, j);
140 log_debug("Merged into installed job %s/%s as %u",
141 uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
144 /* already running and not safe to merge into */
145 /* Patch uj to become a merged job and re-run it. */
146 /* XXX It should be safer to queue j to run after uj finishes, but it is
147 * not currently possible to have more than one installed job per unit. */
148 job_merge_into_installed(uj, j);
149 log_debug("Merged into running job, re-running: %s/%s as %u",
150 uj->unit->id, job_type_to_string(uj->type), (unsigned) uj->id);
151 uj->state = JOB_WAITING;
157 /* Install the job */
160 j->manager->n_installed_jobs ++;
161 log_debug("Installed new job %s/%s as %u", j->unit->id, job_type_to_string(j->type), (unsigned) j->id);
165 JobDependency* job_dependency_new(Job *subject, Job *object, bool matters, bool conflicts) {
170 /* Adds a new job link, which encodes that the 'subject' job
171 * needs the 'object' job in some way. If 'subject' is NULL
172 * this means the 'anchor' job (i.e. the one the user
173 * explicitly asked for) is the requester. */
175 if (!(l = new0(JobDependency, 1)))
178 l->subject = subject;
180 l->matters = matters;
181 l->conflicts = conflicts;
184 LIST_PREPEND(JobDependency, subject, subject->subject_list, l);
186 LIST_PREPEND(JobDependency, object, object->object_list, l);
191 void job_dependency_free(JobDependency *l) {
195 LIST_REMOVE(JobDependency, subject, l->subject->subject_list, l);
197 LIST_REMOVE(JobDependency, object, l->object->object_list, l);
202 void job_dump(Job *j, FILE*f, const char *prefix) {
211 "%s\tAction: %s -> %s\n"
215 prefix, j->unit->id, job_type_to_string(j->type),
216 prefix, job_state_to_string(j->state),
217 prefix, yes_no(j->override));
221 * Merging is commutative, so imagine the matrix as symmetric. We store only
222 * its lower triangle to avoid duplication. We don't store the main diagonal,
223 * because A merged with A is simply A.
225 * Merging is associative! A merged with B merged with C is the same as
226 * A merged with C merged with B.
228 * Mergeability is transitive! If A can be merged with B and B with C then
231 * Also, if A merged with B cannot be merged with C, then either A or B cannot
232 * be merged with C either.
234 static const JobType job_merging_table[] = {
235 /* What \ With * JOB_START JOB_VERIFY_ACTIVE JOB_STOP JOB_RELOAD JOB_RELOAD_OR_START JOB_RESTART JOB_TRY_RESTART */
236 /************************************************************************************************************************************/
238 /*JOB_VERIFY_ACTIVE */ JOB_START,
239 /*JOB_STOP */ -1, -1,
240 /*JOB_RELOAD */ JOB_RELOAD_OR_START, JOB_RELOAD, -1,
241 /*JOB_RELOAD_OR_START*/ JOB_RELOAD_OR_START, JOB_RELOAD_OR_START, -1, JOB_RELOAD_OR_START,
242 /*JOB_RESTART */ JOB_RESTART, JOB_RESTART, -1, JOB_RESTART, JOB_RESTART,
243 /*JOB_TRY_RESTART */ JOB_RESTART, JOB_TRY_RESTART, -1, JOB_TRY_RESTART, JOB_RESTART, JOB_RESTART,
246 JobType job_type_lookup_merge(JobType a, JobType b) {
247 assert_cc(ELEMENTSOF(job_merging_table) == _JOB_TYPE_MAX * (_JOB_TYPE_MAX - 1) / 2);
248 assert(a >= 0 && a < _JOB_TYPE_MAX);
249 assert(b >= 0 && b < _JOB_TYPE_MAX);
260 return job_merging_table[(a - 1) * a / 2 + b];
263 bool job_type_is_redundant(JobType a, UnitActiveState b) {
273 b == UNIT_INACTIVE ||
276 case JOB_VERIFY_ACTIVE:
285 case JOB_RELOAD_OR_START:
287 b == UNIT_ACTIVATING ||
292 b == UNIT_ACTIVATING;
294 case JOB_TRY_RESTART:
296 b == UNIT_ACTIVATING;
299 assert_not_reached("Invalid job type");
303 bool job_is_runnable(Job *j) {
308 assert(j->installed);
310 /* Checks whether there is any job running for the units this
311 * job needs to be running after (in the case of a 'positive'
312 * job type) or before (in the case of a 'negative' job
315 /* First check if there is an override */
319 if (j->type == JOB_START ||
320 j->type == JOB_VERIFY_ACTIVE ||
321 j->type == JOB_RELOAD ||
322 j->type == JOB_RELOAD_OR_START) {
324 /* Immediate result is that the job is or might be
325 * started. In this case lets wait for the
326 * dependencies, regardless whether they are
327 * starting or stopping something. */
329 SET_FOREACH(other, j->unit->dependencies[UNIT_AFTER], i)
334 /* Also, if something else is being stopped and we should
335 * change state after it, then lets wait. */
337 SET_FOREACH(other, j->unit->dependencies[UNIT_BEFORE], i)
339 (other->job->type == JOB_STOP ||
340 other->job->type == JOB_RESTART ||
341 other->job->type == JOB_TRY_RESTART))
344 /* This means that for a service a and a service b where b
345 * shall be started after a:
347 * start a + start b → 1st step start a, 2nd step start b
348 * start a + stop b → 1st step stop b, 2nd step start a
349 * stop a + start b → 1st step stop a, 2nd step start b
350 * stop a + stop b → 1st step stop b, 2nd step stop a
352 * This has the side effect that restarts are properly
353 * synchronized too. */
358 static void job_change_type(Job *j, JobType newtype) {
359 log_debug("Converting job %s/%s -> %s/%s",
360 j->unit->id, job_type_to_string(j->type),
361 j->unit->id, job_type_to_string(newtype));
366 int job_run_and_invalidate(Job *j) {
372 assert(j->installed);
374 if (j->in_run_queue) {
375 LIST_REMOVE(Job, run_queue, j->manager->run_queue, j);
376 j->in_run_queue = false;
379 if (j->state != JOB_WAITING)
382 if (!job_is_runnable(j))
385 j->state = JOB_RUNNING;
386 job_add_to_dbus_queue(j);
388 /* While we execute this operation the job might go away (for
389 * example: because it is replaced by a new, conflicting
390 * job.) To make sure we don't access a freed job later on we
391 * store the id here, so that we can verify the job is still
398 case JOB_RELOAD_OR_START:
399 if (unit_active_state(j->unit) == UNIT_ACTIVE) {
400 job_change_type(j, JOB_RELOAD);
401 r = unit_reload(j->unit);
404 job_change_type(j, JOB_START);
408 r = unit_start(j->unit);
410 /* If this unit cannot be started, then simply wait */
415 case JOB_VERIFY_ACTIVE: {
416 UnitActiveState t = unit_active_state(j->unit);
417 if (UNIT_IS_ACTIVE_OR_RELOADING(t))
419 else if (t == UNIT_ACTIVATING)
426 case JOB_TRY_RESTART:
427 if (UNIT_IS_INACTIVE_OR_DEACTIVATING(unit_active_state(j->unit))) {
431 job_change_type(j, JOB_RESTART);
436 r = unit_stop(j->unit);
438 /* If this unit cannot stopped, then simply wait. */
444 r = unit_reload(j->unit);
448 assert_not_reached("Unknown job type");
451 if ((j = manager_get_job(m, id))) {
453 r = job_finish_and_invalidate(j, JOB_DONE);
454 else if (r == -ENOEXEC)
455 r = job_finish_and_invalidate(j, JOB_SKIPPED);
456 else if (r == -EAGAIN)
457 j->state = JOB_WAITING;
459 r = job_finish_and_invalidate(j, JOB_FAILED);
465 static void job_print_status_message(Unit *u, JobType t, JobResult result) {
468 if (t == JOB_START) {
473 if (u->condition_result)
474 unit_status_printf(u, ANSI_HIGHLIGHT_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, "Started %s", unit_description(u));
478 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON "FAILED" ANSI_HIGHLIGHT_OFF, "Failed to start %s", unit_description(u));
479 unit_status_printf(u, NULL, "See 'systemctl status %s' for details.", u->id);
483 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " ABORT" ANSI_HIGHLIGHT_OFF, "Dependency failed. Aborted start of %s", unit_description(u));
487 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF, "Timed out starting %s", unit_description(u));
494 } else if (t == JOB_STOP) {
499 unit_status_printf(u, ANSI_HIGHLIGHT_RED_ON " TIME " ANSI_HIGHLIGHT_OFF, "Timed out stopping %s", unit_description(u));
504 unit_status_printf(u, ANSI_HIGHLIGHT_GREEN_ON " OK " ANSI_HIGHLIGHT_OFF, "Stopped %s", unit_description(u));
513 int job_finish_and_invalidate(Job *j, JobResult result) {
518 bool recursed = false;
521 assert(j->installed);
523 job_add_to_dbus_queue(j);
525 /* Patch restart jobs so that they become normal start jobs */
526 if (result == JOB_DONE && j->type == JOB_RESTART) {
528 job_change_type(j, JOB_START);
529 j->state = JOB_WAITING;
531 job_add_to_run_queue(j);
539 log_debug("Job %s/%s finished, result=%s", j->unit->id, job_type_to_string(j->type), job_result_to_string(result));
541 if (result == JOB_FAILED)
542 j->manager->n_failed_jobs ++;
549 job_print_status_message(u, t, result);
551 /* Fail depending jobs on failure */
552 if (result != JOB_DONE) {
554 if (t == JOB_START ||
555 t == JOB_VERIFY_ACTIVE ||
556 t == JOB_RELOAD_OR_START) {
558 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY], i)
560 (other->job->type == JOB_START ||
561 other->job->type == JOB_VERIFY_ACTIVE ||
562 other->job->type == JOB_RELOAD_OR_START)) {
563 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
567 SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i)
569 (other->job->type == JOB_START ||
570 other->job->type == JOB_VERIFY_ACTIVE ||
571 other->job->type == JOB_RELOAD_OR_START)) {
572 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
576 SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i)
578 !other->job->override &&
579 (other->job->type == JOB_START ||
580 other->job->type == JOB_VERIFY_ACTIVE ||
581 other->job->type == JOB_RELOAD_OR_START)) {
582 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
586 } else if (t == JOB_STOP) {
588 SET_FOREACH(other, u->dependencies[UNIT_CONFLICTED_BY], i)
590 (other->job->type == JOB_START ||
591 other->job->type == JOB_VERIFY_ACTIVE ||
592 other->job->type == JOB_RELOAD_OR_START)) {
593 job_finish_and_invalidate(other->job, JOB_DEPENDENCY);
599 /* Trigger OnFailure dependencies that are not generated by
600 * the unit itself. We don't tread JOB_CANCELED as failure in
601 * this context. And JOB_FAILURE is already handled by the
603 if (result == JOB_TIMEOUT || result == JOB_DEPENDENCY) {
604 log_notice("Job %s/%s failed with result '%s'.",
606 job_type_to_string(t),
607 job_result_to_string(result));
609 unit_trigger_on_failure(u);
613 /* Try to start the next jobs that can be started */
614 SET_FOREACH(other, u->dependencies[UNIT_AFTER], i)
616 job_add_to_run_queue(other->job);
617 SET_FOREACH(other, u->dependencies[UNIT_BEFORE], i)
619 job_add_to_run_queue(other->job);
621 manager_check_finished(u->manager);
626 int job_start_timer(Job *j) {
627 struct itimerspec its;
628 struct epoll_event ev;
632 if (j->unit->job_timeout <= 0 ||
633 j->timer_watch.type == WATCH_JOB_TIMER)
636 assert(j->timer_watch.type == WATCH_INVALID);
638 if ((fd = timerfd_create(CLOCK_MONOTONIC, TFD_NONBLOCK|TFD_CLOEXEC)) < 0) {
644 timespec_store(&its.it_value, j->unit->job_timeout);
646 if (timerfd_settime(fd, 0, &its, NULL) < 0) {
652 ev.data.ptr = &j->timer_watch;
655 if (epoll_ctl(j->manager->epoll_fd, EPOLL_CTL_ADD, fd, &ev) < 0) {
660 j->timer_watch.type = WATCH_JOB_TIMER;
661 j->timer_watch.fd = fd;
662 j->timer_watch.data.job = j;
668 close_nointr_nofail(fd);
673 void job_add_to_run_queue(Job *j) {
675 assert(j->installed);
680 LIST_PREPEND(Job, run_queue, j->manager->run_queue, j);
681 j->in_run_queue = true;
684 void job_add_to_dbus_queue(Job *j) {
686 assert(j->installed);
688 if (j->in_dbus_queue)
691 /* We don't check if anybody is subscribed here, since this
692 * job might just have been created and not yet assigned to a
693 * connection/client. */
695 LIST_PREPEND(Job, dbus_queue, j->manager->dbus_job_queue, j);
696 j->in_dbus_queue = true;
699 char *job_dbus_path(Job *j) {
704 if (asprintf(&p, "/org/freedesktop/systemd1/job/%lu", (unsigned long) j->id) < 0)
710 void job_timer_event(Job *j, uint64_t n_elapsed, Watch *w) {
712 assert(w == &j->timer_watch);
714 log_warning("Job %s/%s timed out.", j->unit->id, job_type_to_string(j->type));
715 job_finish_and_invalidate(j, JOB_TIMEOUT);
718 static const char* const job_state_table[_JOB_STATE_MAX] = {
719 [JOB_WAITING] = "waiting",
720 [JOB_RUNNING] = "running"
723 DEFINE_STRING_TABLE_LOOKUP(job_state, JobState);
725 static const char* const job_type_table[_JOB_TYPE_MAX] = {
726 [JOB_START] = "start",
727 [JOB_VERIFY_ACTIVE] = "verify-active",
729 [JOB_RELOAD] = "reload",
730 [JOB_RELOAD_OR_START] = "reload-or-start",
731 [JOB_RESTART] = "restart",
732 [JOB_TRY_RESTART] = "try-restart",
735 DEFINE_STRING_TABLE_LOOKUP(job_type, JobType);
737 static const char* const job_mode_table[_JOB_MODE_MAX] = {
739 [JOB_REPLACE] = "replace",
740 [JOB_ISOLATE] = "isolate",
741 [JOB_IGNORE_DEPENDENCIES] = "ignore-dependencies",
742 [JOB_IGNORE_REQUIREMENTS] = "ignore-requirements"
745 DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);
747 static const char* const job_result_table[_JOB_RESULT_MAX] = {
749 [JOB_CANCELED] = "canceled",
750 [JOB_TIMEOUT] = "timeout",
751 [JOB_FAILED] = "failed",
752 [JOB_DEPENDENCY] = "dependency",
753 [JOB_SKIPPED] = "skipped"
756 DEFINE_STRING_TABLE_LOOKUP(job_result, JobResult);