From 31dc1ca3bf9fbb0baf308d213e58ea389cceff4e Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Wed, 21 Mar 2018 12:03:45 +0100 Subject: [PATCH] move MANAGER_IS_RELOADING() check into manager_recheck_{dbus|journal}() (#8510) Let's better check this inside of the call than before it, so that we never issue this while reloading, even should these calls be called due to other reasons than just the unit notify. This makes sure the reload state is unset a bit earlier in manager_reload() so that we can safely call this function from there and they do the right thing. Follow-up for e63ebf71edd7947f29389c72e851d8df5c7bedda. --- src/core/manager.c | 13 ++++++++++--- src/core/unit.c | 6 ++---- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/core/manager.c b/src/core/manager.c index 33a708adf8..7026a58d73 100644 --- a/src/core/manager.c +++ b/src/core/manager.c @@ -3221,6 +3221,9 @@ int manager_reload(Manager *m) { exec_runtime_vacuum(m); + assert(m->n_reloading > 0); + m->n_reloading--; + /* It might be safe to log to the journal now and connect to dbus */ manager_recheck_journal(m); manager_recheck_dbus(m); @@ -3230,9 +3233,6 @@ int manager_reload(Manager *m) { if (q < 0 && r >= 0) r = q; - assert(m->n_reloading > 0); - m->n_reloading--; - m->send_reloading_done = true; return r; @@ -3596,6 +3596,9 @@ void manager_recheck_dbus(Manager *m) { * connection of the API bus). That's because the system bus after all runs as service of the system instance, * while in the user instance we can assume it's already there. */ + if (MANAGER_IS_RELOADING(m)) + return; /* don't check while we are reloading… */ + if (manager_dbus_is_running(m, false)) { (void) bus_init_api(m); @@ -3646,6 +3649,10 @@ void manager_recheck_journal(Manager *m) { if (getpid_cached() != 1) return; + /* Don't check this while we are reloading, things might still change */ + if (MANAGER_IS_RELOADING(m)) + return; + /* The journal is fully and entirely up? If so, let's permit logging to it, if that's configured. If the * journal is down, don't ever log to it, otherwise we might end up deadlocking ourselves as we might trigger * an activation ourselves we can't fulfill. */ diff --git a/src/core/unit.c b/src/core/unit.c index cb45dc290a..52851b6ffc 100644 --- a/src/core/unit.c +++ b/src/core/unit.c @@ -2501,10 +2501,8 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su } } - if (!MANAGER_IS_RELOADING(u->manager)) { - manager_recheck_journal(m); - manager_recheck_dbus(m); - } + manager_recheck_journal(m); + manager_recheck_dbus(m); unit_trigger_notify(u);