]> git.ipfire.org Git - thirdparty/systemd.git/commit
core: track why unit dependencies came to be
authorLennart Poettering <lennart@poettering.net>
Wed, 25 Oct 2017 18:46:01 +0000 (20:46 +0200)
committerLennart Poettering <lennart@poettering.net>
Fri, 10 Nov 2017 18:45:29 +0000 (19:45 +0100)
commiteef85c4a3f8054d29383a176f6cebd1ef3a15b9a
tree318abdf98fbca40552731ef82ad2bb6d9949e1d5
parent8f50e86a868e73e05b7587e2d2bbf4d61dd433cf
core: track why unit dependencies came to be

This replaces the dependencies Set* objects by Hashmap* objects, where
the key is the depending Unit, and the value is a bitmask encoding why
the specific dependency was created.

The bitmask contains a number of different, defined bits, that indicate
why dependencies exist, for example whether they are created due to
explicitly configured deps in files, by udev rules or implicitly.

Note that memory usage is not increased by this change, even though we
store more information, as we manage to encode the bit mask inside the
value pointer each Hashmap entry contains.

Why this all? When we know how a dependency came to be, we can update
dependencies correctly when a configuration source changes but others
are left unaltered. Specifically:

1. We can fix UDEV_WANTS dependency generation: so far we kept adding
   dependencies configured that way, but if a device lost such a
   dependency we couldn't them again as there was no scheme for removing
   of dependencies in place.

2. We can implement "pin-pointed" reload of unit files. If we know what
   dependencies were created as result of configuration in a unit file,
   then we know what to flush out when we want to reload it.

3. It's useful for debugging: "systemd-analyze dump" now shows
   this information, helping substantially with understanding how
   systemd's dependency tree came to be the way it came to be.
20 files changed:
src/core/automount.c
src/core/cgroup.c
src/core/dbus-unit.c
src/core/device.c
src/core/job.c
src/core/load-dropin.c
src/core/load-fragment.c
src/core/manager.c
src/core/mount.c
src/core/path.c
src/core/scope.c
src/core/service.c
src/core/slice.c
src/core/socket.c
src/core/swap.c
src/core/target.c
src/core/timer.c
src/core/transaction.c
src/core/unit.c
src/core/unit.h