diff options
author | Daniel Mack <daniel@zonque.org> | 2015-12-18 17:28:15 +0100 |
---|---|---|
committer | Daniel Mack <daniel@zonque.org> | 2015-12-21 11:23:08 +0100 |
commit | d8ccf5fdc91c46ab5d0ae86e38c206bc508d4188 (patch) | |
tree | 0bb0e99da1d9eb38b5b32d6c05c672d60cd992cd /src/core/service.h | |
parent | 47260caf023c93840b9dbc58305bcc2e2992f79b (diff) |
core: fix bus name synchronization after daemon-reload
During daemon-reload, PID1 temporarly loses its DBus connection, so there's
a small window in which all signals sent by dbus-daemon are lost.
This is a problem, since we rely on the NameOwnerChanged signals in order to
consider a service with Type=dbus fully started or terminated, respectively.
In order to fix this, a rewrite of bus_list_names() is necessary. We used
to walk the current list of names on the bus, and blindly triggered the
bus_name_owner_change() callback on each service, providing the actual name
as current owner. This implementation has a number of problems:
* We cannot detect if the the name was moved from one owner to the other
while we were reloading
* We don't notify services which missed the name loss signal
* Providing the actual name as current owner is a hack, as the comment also
admits.
To fix this, this patch carries the following changes:
* Track the name of the current bus name owner, and (de-)serialize it
during reload. This way, we can detect changes.
* In bus_list_names(), walk the list of bus names we're interested in
first, and then see if the name is active on the bus. If it is,
check it it's still the same as it used to be, and synthesize
NameOwnerChanged signals for the name add and/or loss.
This should fully synchronize the current name list with the internal
state of all services.
Diffstat (limited to 'src/core/service.h')
-rw-r--r-- | src/core/service.h | 1 |
1 files changed, 1 insertions, 0 deletions
diff --git a/src/core/service.h b/src/core/service.h index d0faad88e0..19efbccfc7 100644 --- a/src/core/service.h +++ b/src/core/service.h @@ -172,6 +172,7 @@ struct Service { bool reset_cpu_usage:1; char *bus_name; + char *bus_name_owner; /* unique name of the current owner */ char *status_text; int status_errno; |