]> git.ipfire.org Git - thirdparty/systemd.git/commitdiff
core: re-sync bus name list after deserializing during daemon-reload 2216/head
authorDaniel Mack <daniel@zonque.org>
Tue, 22 Dec 2015 10:37:09 +0000 (11:37 +0100)
committerDaniel Mack <daniel@zonque.org>
Wed, 23 Dec 2015 22:31:35 +0000 (23:31 +0100)
When the daemon reloads, it doesn not actually give up its DBus connection,
as wrongly stated in an earlier commit. However, even though the bus
connection stays open, the daemon flushes out all its internal state.

Hence, if there is a NameOwnerChanged signal after the flush and before the
deserialization, it cannot be matched against any pending unit.

To fix this, rename bus_list_names() to manager_sync_bus_names() and call
it explicitly at the end of the daemon reload operation.

src/core/dbus.c
src/core/dbus.h
src/core/manager.c

index 58069f59c36d757dbd4617879a6393d27a268069..1d89b9e2502f7887b7ed565a930aea1d54379c85 100644 (file)
@@ -734,7 +734,7 @@ static int bus_on_connection(sd_event_source *s, int fd, uint32_t revents, void
         return 0;
 }
 
-static int bus_list_names(Manager *m, sd_bus *bus) {
+int manager_sync_bus_names(Manager *m, sd_bus *bus) {
         _cleanup_strv_free_ char **names = NULL;
         const char *name;
         Iterator i;
@@ -850,7 +850,7 @@ static int bus_setup_api(Manager *m, sd_bus *bus) {
         if (r < 0)
                 return log_error_errno(r, "Failed to register name: %m");
 
-        r = bus_list_names(m, bus);
+        r = manager_sync_bus_names(m, bus);
         if (r < 0)
                 return r;
 
index 4f06ad11c41818a44948fbad97b8cd67988480ed..ff761668f3078c26b4fe5234dd783bed4f6f2ef4 100644 (file)
@@ -34,6 +34,8 @@ void bus_track_serialize(sd_bus_track *t, FILE *f);
 int bus_track_deserialize_item(char ***l, const char *line);
 int bus_track_coldplug(Manager *m, sd_bus_track **t, char ***l);
 
+int manager_sync_bus_names(Manager *m, sd_bus *bus);
+
 int bus_foreach_bus(Manager *m, sd_bus_track *subscribed2, int (*send_message)(sd_bus *bus, void *userdata), void *userdata);
 
 int bus_verify_manage_units_async(Manager *m, sd_bus_message *call, sd_bus_error *error);
index e65616adc1fe76f3cc2a604d81aaffe18453fbf9..ffe27be7432fefa39f79bfa49639747f89f04ac5 100644 (file)
@@ -2574,6 +2574,10 @@ int manager_reload(Manager *m) {
         /* Third, fire things up! */
         manager_coldplug(m);
 
+        /* Sync current state of bus names with our set of listening units */
+        if (m->api_bus)
+                manager_sync_bus_names(m, m->api_bus);
+
         assert(m->n_reloading > 0);
         m->n_reloading--;