1
1
mirror of https://github.com/systemd/systemd-stable.git synced 2024-10-28 03:25:27 +03:00

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.
This commit is contained in:
Daniel Mack 2015-12-22 11:37:09 +01:00
parent a6cff5d3c0
commit 8936a5e34d
3 changed files with 8 additions and 2 deletions

View File

@ -734,7 +734,7 @@ static int bus_on_connection(sd_event_source *s, int fd, uint32_t revents, void
return 0; 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; _cleanup_strv_free_ char **names = NULL;
const char *name; const char *name;
Iterator i; Iterator i;
@ -850,7 +850,7 @@ static int bus_setup_api(Manager *m, sd_bus *bus) {
if (r < 0) if (r < 0)
return log_error_errno(r, "Failed to register name: %m"); 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) if (r < 0)
return r; return r;

View 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_deserialize_item(char ***l, const char *line);
int bus_track_coldplug(Manager *m, sd_bus_track **t, char ***l); 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_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); int bus_verify_manage_units_async(Manager *m, sd_bus_message *call, sd_bus_error *error);

View File

@ -2574,6 +2574,10 @@ int manager_reload(Manager *m) {
/* Third, fire things up! */ /* Third, fire things up! */
manager_coldplug(m); 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); assert(m->n_reloading > 0);
m->n_reloading--; m->n_reloading--;