From 51f14e78a2ae0a971af1ce3cfcbbf8ca8250ca22 Mon Sep 17 00:00:00 2001 From: Anita Zhang Date: Mon, 11 Jan 2021 20:04:20 -0800 Subject: [PATCH 1/3] core: update setings on the unit and job as the result of ExecCondition= Update ExecCondition= to set Unit->condition_result and return JOB_DONE in the Job results if the check fails so as to match the current behavior of ConditionXYZ= w.r.t units/jobs dependency checks. Fixes: #18207 --- src/core/job.c | 3 +-- src/core/service.c | 17 ++++++++++------- src/core/unit.c | 2 -- src/core/unit.h | 1 - 4 files changed, 11 insertions(+), 12 deletions(-) diff --git a/src/core/job.c b/src/core/job.c index f3c1a02831..7d5c288ea4 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -882,8 +882,7 @@ static void job_log_done_status_message(Unit *u, uint32_t job_id, JobType t, Job return; /* Show condition check message if the job did not actually do anything due to failed condition. */ - if ((t == JOB_START && result == JOB_DONE && !u->condition_result) || - (t == JOB_START && result == JOB_SKIPPED)) { + if (t == JOB_START && result == JOB_DONE && !u->condition_result) { log_struct(LOG_INFO, "MESSAGE=Condition check resulted in %s being skipped.", unit_status_string(u), "JOB_ID=%" PRIu32, job_id, diff --git a/src/core/service.c b/src/core/service.c index d7bdeb7cca..3b144153f4 100644 --- a/src/core/service.c +++ b/src/core/service.c @@ -1129,8 +1129,7 @@ static void service_set_state(Service *s, ServiceState state) { unit_notify(UNIT(s), table[old_state], table[state], (s->reload_result == SERVICE_SUCCESS ? 0 : UNIT_NOTIFY_RELOAD_FAILURE) | - (s->will_auto_restart ? UNIT_NOTIFY_WILL_AUTO_RESTART : 0) | - (s->result == SERVICE_SKIP_CONDITION ? UNIT_NOTIFY_SKIP_CONDITION : 0)); + (s->will_auto_restart ? UNIT_NOTIFY_WILL_AUTO_RESTART : 0)); } static usec_t service_coldplug_timeout(Service *s) { @@ -3546,10 +3545,6 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) { } else if (s->control_pid == pid) { s->control_pid = 0; - /* ExecCondition= calls that exit with (0, 254] should invoke skip-like behavior instead of failing */ - if (f == SERVICE_FAILURE_EXIT_CODE && s->state == SERVICE_CONDITION && status < 255) - f = SERVICE_SKIP_CONDITION; - if (s->control_command) { exec_status_exit(&s->control_command->exec_status, &s->exec_context, pid, code, status); @@ -3557,6 +3552,15 @@ static void service_sigchld_event(Unit *u, pid_t pid, int code, int status) { f = SERVICE_SUCCESS; } + /* ExecCondition= calls that exit with (0, 254] should invoke skip-like behavior instead of failing */ + if (s->state == SERVICE_CONDITION) { + if (f == SERVICE_FAILURE_EXIT_CODE && status < 255) { + UNIT(s)->condition_result = false; + f = SERVICE_SKIP_CONDITION; + } else if (f == SERVICE_SUCCESS) + UNIT(s)->condition_result = true; + } + unit_log_process_exit( u, "Control process", @@ -4601,7 +4605,6 @@ const UnitVTable service_vtable = { }, .finished_start_job = { [JOB_FAILED] = "Failed to start %s.", - [JOB_SKIPPED] = "Skipped %s.", }, .finished_stop_job = { [JOB_DONE] = "Stopped %s.", diff --git a/src/core/unit.c b/src/core/unit.c index 45a417a090..9614fb84aa 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -2561,8 +2561,6 @@ static bool unit_process_job(Job *j, UnitActiveState ns, UnitNotifyFlags flags) if (UNIT_IS_INACTIVE_OR_FAILED(ns)) { if (ns == UNIT_FAILED) result = JOB_FAILED; - else if (FLAGS_SET(flags, UNIT_NOTIFY_SKIP_CONDITION)) - result = JOB_SKIPPED; else result = JOB_DONE; diff --git a/src/core/unit.h b/src/core/unit.h index 02b2b24206..f040e9dfe6 100644 --- a/src/core/unit.h +++ b/src/core/unit.h @@ -738,7 +738,6 @@ int unit_kill_common(Unit *u, KillWho who, int signo, pid_t main_pid, pid_t cont typedef enum UnitNotifyFlags { UNIT_NOTIFY_RELOAD_FAILURE = 1 << 0, UNIT_NOTIFY_WILL_AUTO_RESTART = 1 << 1, - UNIT_NOTIFY_SKIP_CONDITION = 1 << 2, } UnitNotifyFlags; void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, UnitNotifyFlags flags); -- 2.29.2