75 lines
2.7 KiB
Diff
75 lines
2.7 KiB
Diff
|
From 8936a5e34dbfa9274348f3fef99f7c9f9327ddf9 Mon Sep 17 00:00:00 2001 [> v228]
|
||
|
From: Daniel Mack <daniel@zonque.org>
|
||
|
Date: Tue, 22 Dec 2015 11:37:09 +0100
|
||
|
Subject: [PATCH] core: re-sync bus name list after deserializing during
|
||
|
daemon-reload
|
||
|
|
||
|
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 | 4 ++--
|
||
|
src/core/dbus.h | 2 ++
|
||
|
src/core/manager.c | 4 ++++
|
||
|
3 files changed, 8 insertions(+), 2 deletions(-)
|
||
|
|
||
|
diff --git a/src/core/dbus.c b/src/core/dbus.c
|
||
|
index 58069f5..1d89b9e 100644
|
||
|
--- a/src/core/dbus.c
|
||
|
+++ b/src/core/dbus.c
|
||
|
@@ -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;
|
||
|
|
||
|
diff --git a/src/core/dbus.h b/src/core/dbus.h
|
||
|
index 4f06ad1..ff76166 100644
|
||
|
--- a/src/core/dbus.h
|
||
|
+++ b/src/core/dbus.h
|
||
|
@@ -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);
|
||
|
diff --git a/src/core/manager.c b/src/core/manager.c
|
||
|
index e65616a..ffe27be 100644
|
||
|
--- a/src/core/manager.c
|
||
|
+++ b/src/core/manager.c
|
||
|
@@ -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--;
|
||
|
|
||
|
--
|
||
|
2.6.2
|
||
|
|