Zbigniew Jędrzejewski-Szmek 176a18
From e63ebf71edd7947f29389c72e851d8df5c7bedda Mon Sep 17 00:00:00 2001
Zbigniew Jędrzejewski-Szmek 176a18
From: =?UTF-8?q?Zbigniew=20J=C4=99drzejewski-Szmek?= <zbyszek@in.waw.pl>
Zbigniew Jędrzejewski-Szmek 176a18
Date: Fri, 16 Mar 2018 23:01:05 +0100
Zbigniew Jędrzejewski-Szmek 176a18
Subject: [PATCH] core: when reloading, delay any actions on journal and dbus
Zbigniew Jędrzejewski-Szmek 176a18
 connections
Zbigniew Jędrzejewski-Szmek 176a18
Zbigniew Jędrzejewski-Szmek 176a18
manager_recheck_journal() and manager_recheck_dbus() would be called to early
Zbigniew Jędrzejewski-Szmek 176a18
while we were deserialiazing units, before the systemd-journald.service and
Zbigniew Jędrzejewski-Szmek 176a18
dbus.service have been deserialized. In effect we'd disable logging to the
Zbigniew Jędrzejewski-Szmek 176a18
journald and close the bus connection. The first is not very noticable, it
Zbigniew Jędrzejewski-Szmek 176a18
mostly means that logs emitted during deserialization are lost. The second is
Zbigniew Jędrzejewski-Szmek 176a18
more noticeable, because manager_recheck_dbus() would call bus_done_api() and
Zbigniew Jędrzejewski-Szmek 176a18
bus_done_system() and close dbus connections. Logging and bus connection would
Zbigniew Jędrzejewski-Szmek 176a18
then be restored later after the respective units have been deserialized.
Zbigniew Jędrzejewski-Szmek 176a18
Zbigniew Jędrzejewski-Szmek 176a18
This is easily reproduced by calling:
Zbigniew Jędrzejewski-Szmek 176a18
  $ sudo gdbus call --system --dest org.freedesktop.systemd1 --object-path /org/freedesktop/systemd1 --method "org.freedesktop.systemd1.Manager.Reload"
Zbigniew Jędrzejewski-Szmek 176a18
which works fine before 8559b3b75cb, and then starts failing with:
Zbigniew Jędrzejewski-Szmek 176a18
  Error: GDBus.Error:org.freedesktop.DBus.Error.NoReply: Remote peer disconnected
Zbigniew Jędrzejewski-Szmek 176a18
Zbigniew Jędrzejewski-Szmek 176a18
None of this should happen, and we should delay changing state until after
Zbigniew Jędrzejewski-Szmek 176a18
deserialization is complete when reloading. manager_reload() already included
Zbigniew Jędrzejewski-Szmek 176a18
the calls to manager_recheck_journal() and manager_recheck_dbus(), so the
Zbigniew Jędrzejewski-Szmek 176a18
connection state will be updated after deserialization during reloading is done.
Zbigniew Jędrzejewski-Szmek 176a18
Zbigniew Jędrzejewski-Szmek 176a18
Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1554578.
Zbigniew Jędrzejewski-Szmek 176a18
---
Zbigniew Jędrzejewski-Szmek 176a18
 src/core/unit.c | 7 +++++--
Zbigniew Jędrzejewski-Szmek 176a18
 1 file changed, 5 insertions(+), 2 deletions(-)
Zbigniew Jędrzejewski-Szmek 176a18
Zbigniew Jędrzejewski-Szmek 176a18
diff --git a/src/core/unit.c b/src/core/unit.c
Zbigniew Jędrzejewski-Szmek 176a18
index 815701ad4e..f88aabba61 100644
Zbigniew Jędrzejewski-Szmek 176a18
--- a/src/core/unit.c
Zbigniew Jędrzejewski-Szmek 176a18
+++ b/src/core/unit.c
Zbigniew Jędrzejewski-Szmek 176a18
@@ -2501,8 +2501,11 @@ void unit_notify(Unit *u, UnitActiveState os, UnitActiveState ns, bool reload_su
Zbigniew Jędrzejewski-Szmek 176a18
                 }
Zbigniew Jędrzejewski-Szmek 176a18
         }
Zbigniew Jędrzejewski-Szmek 176a18
 
Zbigniew Jędrzejewski-Szmek 176a18
-        manager_recheck_journal(m);
Zbigniew Jędrzejewski-Szmek 176a18
-        manager_recheck_dbus(m);
Zbigniew Jędrzejewski-Szmek 176a18
+        if (!MANAGER_IS_RELOADING(u->manager)) {
Zbigniew Jędrzejewski-Szmek 176a18
+                manager_recheck_journal(m);
Zbigniew Jędrzejewski-Szmek 176a18
+                manager_recheck_dbus(m);
Zbigniew Jędrzejewski-Szmek 176a18
+        }
Zbigniew Jędrzejewski-Szmek 176a18
+
Zbigniew Jędrzejewski-Szmek 176a18
         unit_trigger_notify(u);
Zbigniew Jędrzejewski-Szmek 176a18
 
Zbigniew Jędrzejewski-Szmek 176a18
         if (!MANAGER_IS_RELOADING(u->manager)) {