core: always coldplug units that are triggered by other units before those

Let's make sure that we don't enqueue triggering jobs for units before
those units are actually fully loaded.

http://lists.freedesktop.org/archives/systemd-devel/2015-April/031176.html
https://bugs.freedesktop.org/show_bug.cgi?id=88401
This commit is contained in:
Lennart Poettering 2015-04-24 16:04:50 +02:00
parent 0108f6ecc8
commit f78f265f40
2 changed files with 25 additions and 2 deletions

View File

@ -2876,13 +2876,32 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
}
int unit_coldplug(Unit *u) {
Unit *other;
Iterator i;
int r;
assert(u);
if (UNIT_VTABLE(u)->coldplug)
if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
/* Make sure we don't enter a loop, when coldplugging
* recursively. */
if (u->coldplugged)
return 0;
u->coldplugged = true;
/* Make sure everything that we might pull in through
* triggering is coldplugged before us */
SET_FOREACH(other, u->dependencies[UNIT_TRIGGERS], i) {
r = unit_coldplug(other);
if (r < 0)
return r;
}
if (UNIT_VTABLE(u)->coldplug) {
r = UNIT_VTABLE(u)->coldplug(u);
if (r < 0)
return r;
}
if (u->job) {
r = job_coldplug(u->job);

View File

@ -104,6 +104,7 @@ struct Unit {
char *fragment_path; /* if loaded from a config file this is the primary path to it */
char *source_path; /* if converted, the source file */
char **dropin_paths;
usec_t fragment_mtime;
usec_t source_mtime;
usec_t dropin_mtime;
@ -233,6 +234,9 @@ struct Unit {
bool cgroup_realized:1;
bool cgroup_members_mask_valid:1;
bool cgroup_subtree_mask_valid:1;
/* Did we already invoke unit_coldplug() for this unit? */
bool coldplugged;
};
struct UnitStatusMessageFormats {