You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
244 lines
12 KiB
244 lines
12 KiB
From a7ec486dede56ab2ec28132133becf11e5685884 Mon Sep 17 00:00:00 2001 |
|
From: Michal Sekletar <msekletar@users.noreply.github.com> |
|
Date: Mon, 16 May 2016 17:24:51 +0200 |
|
Subject: [PATCH] core: don't log job status message in case job was |
|
effectively NOP (#3199) |
|
|
|
We currently generate log message about unit being started even when |
|
unit was started already and job didn't do anything. This is because job |
|
was requested explicitly and hence became anchor job of the transaction |
|
thus we could not eliminate it. That is fine but, let's not pollute |
|
journal with useless log messages. |
|
|
|
$ systemctl start systemd-resolved |
|
$ systemctl start systemd-resolved |
|
$ systemctl start systemd-resolved |
|
|
|
Current state: |
|
$ journalctl -u systemd-resolved | grep Started |
|
|
|
May 05 15:31:42 rawhide systemd[1]: Started Network Name Resolution. |
|
May 05 15:31:59 rawhide systemd[1]: Started Network Name Resolution. |
|
May 05 15:32:01 rawhide systemd[1]: Started Network Name Resolution. |
|
|
|
After patch applied: |
|
$ journalctl -u systemd-resolved | grep Started |
|
|
|
May 05 16:42:12 rawhide systemd[1]: Started Network Name Resolution. |
|
|
|
Fixes #1723 |
|
|
|
Cherry-picked from: 833f92ad39beca0e954e91e5764ffc83f8d0c1cf |
|
Resolves: #1280014 |
|
--- |
|
src/core/dbus-job.c | 2 +- |
|
src/core/job.c | 33 ++++++++++++++++++--------------- |
|
src/core/job.h | 2 +- |
|
src/core/manager.c | 2 +- |
|
src/core/transaction.c | 2 +- |
|
src/core/unit.c | 12 ++++++------ |
|
6 files changed, 28 insertions(+), 25 deletions(-) |
|
|
|
diff --git a/src/core/dbus-job.c b/src/core/dbus-job.c |
|
index 8b5ea2566d..7ce5d57726 100644 |
|
--- a/src/core/dbus-job.c |
|
+++ b/src/core/dbus-job.c |
|
@@ -84,7 +84,7 @@ int bus_job_method_cancel(sd_bus *bus, sd_bus_message *message, void *userdata, |
|
if (r < 0) |
|
return r; |
|
|
|
- job_finish_and_invalidate(j, JOB_CANCELED, true); |
|
+ job_finish_and_invalidate(j, JOB_CANCELED, true, false); |
|
|
|
return sd_bus_reply_method_return(message, NULL); |
|
} |
|
diff --git a/src/core/job.c b/src/core/job.c |
|
index 7416386a18..c2876dec18 100644 |
|
--- a/src/core/job.c |
|
+++ b/src/core/job.c |
|
@@ -190,7 +190,7 @@ Job* job_install(Job *j) { |
|
|
|
if (uj) { |
|
if (job_type_is_conflicting(uj->type, j->type)) |
|
- job_finish_and_invalidate(uj, JOB_CANCELED, false); |
|
+ job_finish_and_invalidate(uj, JOB_CANCELED, false, false); |
|
else { |
|
/* not conflicting, i.e. mergeable */ |
|
|
|
@@ -571,19 +571,19 @@ int job_run_and_invalidate(Job *j) { |
|
j = manager_get_job(m, id); |
|
if (j) { |
|
if (r == -EALREADY) |
|
- r = job_finish_and_invalidate(j, JOB_DONE, true); |
|
+ r = job_finish_and_invalidate(j, JOB_DONE, true, true); |
|
else if (r == -EBADR) |
|
- r = job_finish_and_invalidate(j, JOB_SKIPPED, true); |
|
+ r = job_finish_and_invalidate(j, JOB_SKIPPED, true, false); |
|
else if (r == -ENOEXEC) |
|
- r = job_finish_and_invalidate(j, JOB_INVALID, true); |
|
+ r = job_finish_and_invalidate(j, JOB_INVALID, true, false); |
|
else if (r == -EPROTO) |
|
- r = job_finish_and_invalidate(j, JOB_ASSERT, true); |
|
+ r = job_finish_and_invalidate(j, JOB_ASSERT, true, false); |
|
else if (r == -ENOTSUP) |
|
- r = job_finish_and_invalidate(j, JOB_UNSUPPORTED, true); |
|
+ r = job_finish_and_invalidate(j, JOB_UNSUPPORTED, true, false); |
|
else if (r == -EAGAIN) |
|
job_set_state(j, JOB_WAITING); |
|
else if (r < 0) |
|
- r = job_finish_and_invalidate(j, JOB_FAILED, true); |
|
+ r = job_finish_and_invalidate(j, JOB_FAILED, true, false); |
|
} |
|
|
|
return r; |
|
@@ -792,7 +792,7 @@ static void job_log_status_message(Unit *u, JobType t, JobResult result) { |
|
NULL); |
|
} |
|
|
|
-int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) { |
|
+int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool already) { |
|
Unit *u; |
|
Unit *other; |
|
JobType t; |
|
@@ -810,8 +810,11 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) { |
|
log_unit_debug(u->id, "Job %s/%s finished, result=%s", |
|
u->id, job_type_to_string(t), job_result_to_string(result)); |
|
|
|
- job_print_status_message(u, t, result); |
|
- job_log_status_message(u, t, result); |
|
+ /* If this job did nothing to respective unit we don't log the status message */ |
|
+ if (!already) { |
|
+ job_print_status_message(u, t, result); |
|
+ job_log_status_message(u, t, result); |
|
+ } |
|
|
|
job_add_to_dbus_queue(j); |
|
|
|
@@ -842,20 +845,20 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) { |
|
if (other->job && |
|
(other->job->type == JOB_START || |
|
other->job->type == JOB_VERIFY_ACTIVE)) |
|
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true); |
|
+ job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true, false); |
|
|
|
SET_FOREACH(other, u->dependencies[UNIT_BOUND_BY], i) |
|
if (other->job && |
|
(other->job->type == JOB_START || |
|
other->job->type == JOB_VERIFY_ACTIVE)) |
|
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true); |
|
+ job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true, false); |
|
|
|
SET_FOREACH(other, u->dependencies[UNIT_REQUIRED_BY_OVERRIDABLE], i) |
|
if (other->job && |
|
!other->job->override && |
|
(other->job->type == JOB_START || |
|
other->job->type == JOB_VERIFY_ACTIVE)) |
|
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true); |
|
+ job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true, false); |
|
|
|
} else if (t == JOB_STOP) { |
|
|
|
@@ -863,7 +866,7 @@ int job_finish_and_invalidate(Job *j, JobResult result, bool recursive) { |
|
if (other->job && |
|
(other->job->type == JOB_START || |
|
other->job->type == JOB_VERIFY_ACTIVE)) |
|
- job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true); |
|
+ job_finish_and_invalidate(other->job, JOB_DEPENDENCY, true, false); |
|
} |
|
} |
|
|
|
@@ -911,7 +914,7 @@ static int job_dispatch_timer(sd_event_source *s, uint64_t monotonic, void *user |
|
log_unit_warning(j->unit->id, "Job %s/%s timed out.", j->unit->id, job_type_to_string(j->type)); |
|
|
|
u = j->unit; |
|
- job_finish_and_invalidate(j, JOB_TIMEOUT, true); |
|
+ job_finish_and_invalidate(j, JOB_TIMEOUT, true, false); |
|
|
|
failure_action(u->manager, u->job_timeout_action, u->job_timeout_reboot_arg); |
|
|
|
diff --git a/src/core/job.h b/src/core/job.h |
|
index d967b68a3f..e4191ee775 100644 |
|
--- a/src/core/job.h |
|
+++ b/src/core/job.h |
|
@@ -220,7 +220,7 @@ void job_add_to_dbus_queue(Job *j); |
|
int job_start_timer(Job *j); |
|
|
|
int job_run_and_invalidate(Job *j); |
|
-int job_finish_and_invalidate(Job *j, JobResult result, bool recursive); |
|
+int job_finish_and_invalidate(Job *j, JobResult result, bool recursive, bool already); |
|
|
|
char *job_dbus_path(Job *j); |
|
|
|
diff --git a/src/core/manager.c b/src/core/manager.c |
|
index a1504bf17b..ee456fb790 100644 |
|
--- a/src/core/manager.c |
|
+++ b/src/core/manager.c |
|
@@ -1426,7 +1426,7 @@ void manager_clear_jobs(Manager *m) { |
|
|
|
while ((j = hashmap_first(m->jobs))) |
|
/* No need to recurse. We're cancelling all jobs. */ |
|
- job_finish_and_invalidate(j, JOB_CANCELED, false); |
|
+ job_finish_and_invalidate(j, JOB_CANCELED, false, false); |
|
} |
|
|
|
static int manager_dispatch_run_queue(sd_event_source *source, void *userdata) { |
|
diff --git a/src/core/transaction.c b/src/core/transaction.c |
|
index b0b3d6bd60..aed64fa419 100644 |
|
--- a/src/core/transaction.c |
|
+++ b/src/core/transaction.c |
|
@@ -592,7 +592,7 @@ static int transaction_apply(Transaction *tr, Manager *m, JobMode mode) { |
|
/* Not invalidating recursively. Avoids triggering |
|
* OnFailure= actions of dependent jobs. Also avoids |
|
* invalidating our iterator. */ |
|
- job_finish_and_invalidate(j, JOB_CANCELED, false); |
|
+ job_finish_and_invalidate(j, JOB_CANCELED, false, false); |
|
} |
|
} |
|
|
|
diff --git a/src/core/unit.c b/src/core/unit.c |
|
index db5aa987ec..d6ead7d672 100644 |
|
--- a/src/core/unit.c |
|
+++ b/src/core/unit.c |
|
@@ -1851,12 +1851,12 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su |
|
case JOB_VERIFY_ACTIVE: |
|
|
|
if (UNIT_IS_ACTIVE_OR_RELOADING(ns)) |
|
- job_finish_and_invalidate(u->job, JOB_DONE, true); |
|
+ job_finish_and_invalidate(u->job, JOB_DONE, true, false); |
|
else if (u->job->state == JOB_RUNNING && ns != UNIT_ACTIVATING) { |
|
unexpected = true; |
|
|
|
if (UNIT_IS_INACTIVE_OR_FAILED(ns)) |
|
- job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true); |
|
+ job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false); |
|
} |
|
|
|
break; |
|
@@ -1866,12 +1866,12 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su |
|
|
|
if (u->job->state == JOB_RUNNING) { |
|
if (ns == UNIT_ACTIVE) |
|
- job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true); |
|
+ job_finish_and_invalidate(u->job, reload_success ? JOB_DONE : JOB_FAILED, true, false); |
|
else if (ns != UNIT_ACTIVATING && ns != UNIT_RELOADING) { |
|
unexpected = true; |
|
|
|
if (UNIT_IS_INACTIVE_OR_FAILED(ns)) |
|
- job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true); |
|
+ job_finish_and_invalidate(u->job, ns == UNIT_FAILED ? JOB_FAILED : JOB_DONE, true, false); |
|
} |
|
} |
|
|
|
@@ -1882,10 +1882,10 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su |
|
case JOB_TRY_RESTART: |
|
|
|
if (UNIT_IS_INACTIVE_OR_FAILED(ns)) |
|
- job_finish_and_invalidate(u->job, JOB_DONE, true); |
|
+ job_finish_and_invalidate(u->job, JOB_DONE, true, false); |
|
else if (u->job->state == JOB_RUNNING && ns != UNIT_DEACTIVATING) { |
|
unexpected = true; |
|
- job_finish_and_invalidate(u->job, JOB_FAILED, true); |
|
+ job_finish_and_invalidate(u->job, JOB_FAILED, true, false); |
|
} |
|
|
|
break;
|
|
|