[systemd-commits] src/core

Lennart Poettering lennart at kemper.freedesktop.org
Mon Apr 27 12:49:17 PDT 2015


 src/core/transaction.c |    7 +++++++
 src/core/unit.c        |    8 --------
 2 files changed, 7 insertions(+), 8 deletions(-)

New commits:
commit 4370633083dd9453da183c468cf89cc17254ac39
Author: Ivan Shapovalov <intelfx100 at gmail.com>
Date:   Mon Apr 27 21:19:02 2015 +0300

    core: coldplug all units which participate in jobs during coldplugging
    
    This is yet another attempt to fix coldplugging order (more especially,
    the problem which happens when one creates a job during coldplugging and
    it references a not-yet-coldplugged unit).
    
    Now we forcibly coldplug all units which participate in jobs. This
    is a superset of previously implemented handling of the UNIT_TRIGGERS
    dependencies, so that handling is removed.
    
    http://lists.freedesktop.org/archives/systemd-devel/2015-April/031212.html
    https://bugs.freedesktop.org/show_bug.cgi?id=88401 (once again)

diff --git a/src/core/transaction.c b/src/core/transaction.c
index 5974b1e..7b19e2f 100644
--- a/src/core/transaction.c
+++ b/src/core/transaction.c
@@ -848,6 +848,13 @@ int transaction_add_job_and_dependencies(
         assert(type < _JOB_TYPE_MAX_IN_TRANSACTION);
         assert(unit);
 
+        /* Before adding jobs for this unit, let's ensure that its state has been loaded
+         * This matters when jobs are spawned as part of coldplugging itself (see e. g. path_coldplug()).
+         * This way, we "recursively" coldplug units, ensuring that we do not look at state of
+         * not-yet-coldplugged units. */
+        if (unit->manager->n_reloading > 0)
+                unit_coldplug(unit);
+
         /* log_debug("Pulling in %s/%s from %s/%s", */
         /*           unit->id, job_type_to_string(type), */
         /*           by ? by->unit->id : "NA", */
diff --git a/src/core/unit.c b/src/core/unit.c
index 496db6c..b7ab084 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2893,14 +2893,6 @@ int unit_coldplug(Unit *u) {
 
         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)



More information about the systemd-commits mailing list