]> git.ipfire.org Git - thirdparty/systemd.git/commit - src/core/service.c
core: drop initial ListNames() bus call from PID 1 14424/head
authorLennart Poettering <lennart@poettering.net>
Mon, 23 Dec 2019 16:31:34 +0000 (17:31 +0100)
committerLennart Poettering <lennart@poettering.net>
Mon, 6 Jan 2020 14:21:47 +0000 (15:21 +0100)
commitfc67a943d989d5e74577adea9676cdc7928b08fc
tree805830f856b86e3edf538fbee71484a5d865882e
parenta5b07847950c603605acf85b472b210cd2da40fb
core: drop initial ListNames() bus call from PID 1

Previously, when first connecting to the bus after connecting to it we'd
issue a ListNames() bus call to the driver to figure out which bus names
are currently active. This information was then used to initialize the
initial state for services that use BusName=.

This change removes the whole code for this and replaces it with
something vastly simpler.

First of all, the ListNames() call was issues synchronosuly, which meant
if dbus was for some reason synchronously calling into PID1 for some
reason we'd deadlock. As it turns out there's now a good chance it does:
the nss-systemd userdb hookup means that any user dbus-daemon resolves
might result in a varlink call into PID 1, and dbus resolves quite a lot
of users while parsing its policy. My original goal was to fix this
deadlock.

But as it turns out we don't need the ListNames() call at all anymore,
since #12957 has been merged. That PR was supposed to fix a race where
asynchronous installation of bus matches would cause us missing the
initial owner of a bus name when a service is first started. It fixed it
(correctly) by enquiring with GetOwnerName() who currently owns the
name, right after installing the match. But this means whenever we start watching a bus name we anyway
issue a GetOwnerName() for it, and that means also when first connecting
to the bus we don't need to issue ListNames() anymore since that just
tells us the same info: which names are currently owned.

hence, let's drop ListNames() and instead make better use of the
GetOwnerName() result: if it failed the name is not owned.

Also, while we are at it, let's simplify the unit's owner_name_changed()
callback(): let's drop the "old_owner" argument. We never used that
besides logging, and it's hard to synthesize from just the return of a
GetOwnerName(), hence don't bother.
src/core/dbus.c
src/core/dbus.h
src/core/manager.c
src/core/manager.h
src/core/service.c
src/core/unit.c
src/core/unit.h