[systemd-commits] src/core

Lennart Poettering lennart at kemper.freedesktop.org
Fri Apr 24 06:54:55 PDT 2015


 src/core/automount.c |    2 +-
 src/core/busname.c   |    2 +-
 src/core/device.c    |    2 +-
 src/core/manager.c   |   35 ++---------------------------------
 src/core/mount.c     |    2 +-
 src/core/path.c      |   14 ++++----------
 src/core/scope.c     |    2 +-
 src/core/service.c   |    2 +-
 src/core/slice.c     |    2 +-
 src/core/snapshot.c  |    2 +-
 src/core/socket.c    |    2 +-
 src/core/swap.c      |    2 +-
 src/core/target.c    |    2 +-
 src/core/timer.c     |   14 ++++----------
 src/core/unit.c      |   25 +++++++++----------------
 src/core/unit.h      |   12 +++---------
 16 files changed, 33 insertions(+), 89 deletions(-)

New commits:
commit be847e82cf95bf8eb589778df2aa2b3d1d7ae99e
Author: Lennart Poettering <lennart at poettering.net>
Date:   Fri Apr 24 15:27:19 2015 +0200

    Revert "core: do not spawn jobs or touch other units during coldplugging"
    
    This reverts commit 6e392c9c45643d106673c6643ac8bf4e65da13c1.
    
    We really shouldn't invent external state keeping hashmaps, if we can
    keep this state in the units themselves.

diff --git a/src/core/automount.c b/src/core/automount.c
index b3e96fc..6fc214b 100644
--- a/src/core/automount.c
+++ b/src/core/automount.c
@@ -259,7 +259,7 @@ static void automount_set_state(Automount *a, AutomountState state) {
         unit_notify(UNIT(a), state_translation_table[old_state], state_translation_table[state], true);
 }
 
-static int automount_coldplug(Unit *u, Hashmap *deferred_work) {
+static int automount_coldplug(Unit *u) {
         Automount *a = AUTOMOUNT(u);
         int r;
 
diff --git a/src/core/busname.c b/src/core/busname.c
index b1b953a..aba2a96 100644
--- a/src/core/busname.c
+++ b/src/core/busname.c
@@ -336,7 +336,7 @@ static void busname_set_state(BusName *n, BusNameState state) {
         unit_notify(UNIT(n), state_translation_table[old_state], state_translation_table[state], true);
 }
 
-static int busname_coldplug(Unit *u, Hashmap *deferred_work) {
+static int busname_coldplug(Unit *u) {
         BusName *n = BUSNAME(u);
         int r;
 
diff --git a/src/core/device.c b/src/core/device.c
index a757230..63bae97 100644
--- a/src/core/device.c
+++ b/src/core/device.c
@@ -140,7 +140,7 @@ static void device_set_state(Device *d, DeviceState state) {
         unit_notify(UNIT(d), state_translation_table[old_state], state_translation_table[state], true);
 }
 
-static int device_coldplug(Unit *u, Hashmap *deferred_work) {
+static int device_coldplug(Unit *u) {
         Device *d = DEVICE(u);
 
         assert(d);
diff --git a/src/core/manager.c b/src/core/manager.c
index 2b04644..39a868f 100644
--- a/src/core/manager.c
+++ b/src/core/manager.c
@@ -981,28 +981,7 @@ static int manager_coldplug(Manager *m) {
         Unit *u;
         char *k;
 
-        /*
-         * Some unit types tend to spawn jobs or check other units' state
-         * during coldplug. This is wrong because it is undefined whether the
-         * units in question have been already coldplugged (i. e. their state
-         * restored). This way, we can easily re-start an already started unit
-         * or otherwise make a wrong decision based on the unit's state.
-         *
-         * Solve this by providing a way for coldplug functions to defer
-         * such actions until after all units have been coldplugged.
-         *
-         * We store Unit* -> int(*)(Unit*).
-         *
-         * https://bugs.freedesktop.org/show_bug.cgi?id=88401
-         */
-        _cleanup_hashmap_free_ Hashmap *deferred_work = NULL;
-        int(*proc)(Unit*);
-
-        assert(m);
-
-        deferred_work = hashmap_new(&trivial_hash_ops);
-        if (!deferred_work)
-                return -ENOMEM;
+        assert(m);
 
         /* Then, let's set up their initial state. */
         HASHMAP_FOREACH_KEY(u, k, m->units, i) {
@@ -1012,17 +991,7 @@ static int manager_coldplug(Manager *m) {
                 if (u->id != k)
                         continue;
 
-                q = unit_coldplug(u, deferred_work);
-                if (q < 0)
-                        r = q;
-        }
-
-        /* After coldplugging and setting up initial state of the units,
-         * let's perform operations which spawn jobs or query units' state. */
-        HASHMAP_FOREACH_KEY(proc, u, deferred_work, i) {
-                int q;
-
-                q = proc(u);
+                q = unit_coldplug(u);
                 if (q < 0)
                         r = q;
         }
diff --git a/src/core/mount.c b/src/core/mount.c
index d3a4098..eb25bcb 100644
--- a/src/core/mount.c
+++ b/src/core/mount.c
@@ -601,7 +601,7 @@ static void mount_set_state(Mount *m, MountState state) {
         m->reload_result = MOUNT_SUCCESS;
 }
 
-static int mount_coldplug(Unit *u, Hashmap *deferred_work) {
+static int mount_coldplug(Unit *u) {
         Mount *m = MOUNT(u);
         MountState new_state = MOUNT_DEAD;
         int r;
diff --git a/src/core/path.c b/src/core/path.c
index 6be9ac8..fbb695d 100644
--- a/src/core/path.c
+++ b/src/core/path.c
@@ -438,12 +438,7 @@ static void path_set_state(Path *p, PathState state) {
 
 static void path_enter_waiting(Path *p, bool initial, bool recheck);
 
-static int path_enter_waiting_coldplug(Unit *u) {
-        path_enter_waiting(PATH(u), true, true);
-        return 0;
-}
-
-static int path_coldplug(Unit *u, Hashmap *deferred_work) {
+static int path_coldplug(Unit *u) {
         Path *p = PATH(u);
 
         assert(p);
@@ -452,10 +447,9 @@ static int path_coldplug(Unit *u, Hashmap *deferred_work) {
         if (p->deserialized_state != p->state) {
 
                 if (p->deserialized_state == PATH_WAITING ||
-                    p->deserialized_state == PATH_RUNNING) {
-                        hashmap_put(deferred_work, u, &path_enter_waiting_coldplug);
-                        path_set_state(p, PATH_WAITING);
-                } else
+                    p->deserialized_state == PATH_RUNNING)
+                        path_enter_waiting(p, true, true);
+                else
                         path_set_state(p, p->deserialized_state);
         }
 
diff --git a/src/core/scope.c b/src/core/scope.c
index 8b2bb29..1c3c6bb 100644
--- a/src/core/scope.c
+++ b/src/core/scope.c
@@ -171,7 +171,7 @@ static int scope_load(Unit *u) {
         return scope_verify(s);
 }
 
-static int scope_coldplug(Unit *u, Hashmap *deferred_work) {
+static int scope_coldplug(Unit *u) {
         Scope *s = SCOPE(u);
         int r;
 
diff --git a/src/core/service.c b/src/core/service.c
index 0e2f114..9104347 100644
--- a/src/core/service.c
+++ b/src/core/service.c
@@ -879,7 +879,7 @@ static void service_set_state(Service *s, ServiceState state) {
         s->reload_result = SERVICE_SUCCESS;
 }
 
-static int service_coldplug(Unit *u, Hashmap *deferred_work) {
+static int service_coldplug(Unit *u) {
         Service *s = SERVICE(u);
         int r;
 
diff --git a/src/core/slice.c b/src/core/slice.c
index 0285c49..0bebdbc 100644
--- a/src/core/slice.c
+++ b/src/core/slice.c
@@ -150,7 +150,7 @@ static int slice_load(Unit *u) {
         return slice_verify(s);
 }
 
-static int slice_coldplug(Unit *u, Hashmap *deferred_work) {
+static int slice_coldplug(Unit *u) {
         Slice *t = SLICE(u);
 
         assert(t);
diff --git a/src/core/snapshot.c b/src/core/snapshot.c
index b1d8448..b70c3be 100644
--- a/src/core/snapshot.c
+++ b/src/core/snapshot.c
@@ -75,7 +75,7 @@ static int snapshot_load(Unit *u) {
         return 0;
 }
 
-static int snapshot_coldplug(Unit *u, Hashmap *deferred_work) {
+static int snapshot_coldplug(Unit *u) {
         Snapshot *s = SNAPSHOT(u);
 
         assert(s);
diff --git a/src/core/socket.c b/src/core/socket.c
index dd805d5..1f931eb 100644
--- a/src/core/socket.c
+++ b/src/core/socket.c
@@ -1323,7 +1323,7 @@ static void socket_set_state(Socket *s, SocketState state) {
         unit_notify(UNIT(s), state_translation_table[old_state], state_translation_table[state], true);
 }
 
-static int socket_coldplug(Unit *u, Hashmap *deferred_work) {
+static int socket_coldplug(Unit *u) {
         Socket *s = SOCKET(u);
         int r;
 
diff --git a/src/core/swap.c b/src/core/swap.c
index 76660cc..74f26b7 100644
--- a/src/core/swap.c
+++ b/src/core/swap.c
@@ -507,7 +507,7 @@ static void swap_set_state(Swap *s, SwapState state) {
                         job_add_to_run_queue(UNIT(other)->job);
 }
 
-static int swap_coldplug(Unit *u, Hashmap *deferred_work) {
+static int swap_coldplug(Unit *u) {
         Swap *s = SWAP(u);
         SwapState new_state = SWAP_DEAD;
         int r;
diff --git a/src/core/target.c b/src/core/target.c
index 5f64402..8817ef2 100644
--- a/src/core/target.c
+++ b/src/core/target.c
@@ -103,7 +103,7 @@ static int target_load(Unit *u) {
         return 0;
 }
 
-static int target_coldplug(Unit *u, Hashmap *deferred_work) {
+static int target_coldplug(Unit *u) {
         Target *t = TARGET(u);
 
         assert(t);
diff --git a/src/core/timer.c b/src/core/timer.c
index 79a7540..9405501 100644
--- a/src/core/timer.c
+++ b/src/core/timer.c
@@ -267,12 +267,7 @@ static void timer_set_state(Timer *t, TimerState state) {
 
 static void timer_enter_waiting(Timer *t, bool initial);
 
-static int timer_enter_waiting_coldplug(Unit *u) {
-        timer_enter_waiting(TIMER(u), false);
-        return 0;
-}
-
-static int timer_coldplug(Unit *u, Hashmap *deferred_work) {
+static int timer_coldplug(Unit *u) {
         Timer *t = TIMER(u);
 
         assert(t);
@@ -280,10 +275,9 @@ static int timer_coldplug(Unit *u, Hashmap *deferred_work) {
 
         if (t->deserialized_state != t->state) {
 
-                if (t->deserialized_state == TIMER_WAITING) {
-                        hashmap_put(deferred_work, u, &timer_enter_waiting_coldplug);
-                        timer_set_state(t, TIMER_WAITING);
-                } else
+                if (t->deserialized_state == TIMER_WAITING)
+                        timer_enter_waiting(t, false);
+                else
                         timer_set_state(t, t->deserialized_state);
         }
 
diff --git a/src/core/unit.c b/src/core/unit.c
index e921b48..70a2b57 100644
--- a/src/core/unit.c
+++ b/src/core/unit.c
@@ -2875,34 +2875,27 @@ int unit_add_node_link(Unit *u, const char *what, bool wants) {
         return 0;
 }
 
-static int unit_add_deserialized_job_coldplug(Unit *u) {
-        int r;
-
-        r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
-        if (r < 0)
-                return r;
-
-        u->deserialized_job = _JOB_TYPE_INVALID;
-
-        return 0;
-}
-
-int unit_coldplug(Unit *u, Hashmap *deferred_work) {
+int unit_coldplug(Unit *u) {
         int r;
 
         assert(u);
 
         if (UNIT_VTABLE(u)->coldplug)
-                if ((r = UNIT_VTABLE(u)->coldplug(u, deferred_work)) < 0)
+                if ((r = UNIT_VTABLE(u)->coldplug(u)) < 0)
                         return r;
 
         if (u->job) {
                 r = job_coldplug(u->job);
                 if (r < 0)
                         return r;
-        } else if (u->deserialized_job >= 0)
+        } else if (u->deserialized_job >= 0) {
                 /* legacy */
-                hashmap_put(deferred_work, u, &unit_add_deserialized_job_coldplug);
+                r = manager_add_job(u->manager, u->deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL);
+                if (r < 0)
+                        return r;
+
+                u->deserialized_job = _JOB_TYPE_INVALID;
+        }
 
         return 0;
 }
diff --git a/src/core/unit.h b/src/core/unit.h
index 260dc45..be306a0 100644
--- a/src/core/unit.h
+++ b/src/core/unit.h
@@ -303,14 +303,8 @@ struct UnitVTable {
         int (*load)(Unit *u);
 
         /* If a lot of units got created via enumerate(), this is
-         * where to actually set the state and call unit_notify().
-         *
-         * This must not reference other units (maybe implicitly through spawning
-         * jobs), because it is possible that they are not yet coldplugged.
-         * Such actions must be deferred until the end of coldplug bу adding
-         * a "Unit* -> int(*)(Unit*)" entry into the hashmap.
-         */
-        int (*coldplug)(Unit *u, Hashmap *deferred_work);
+         * where to actually set the state and call unit_notify(). */
+        int (*coldplug)(Unit *u);
 
         void (*dump)(Unit *u, FILE *f, const char *prefix);
 
@@ -546,7 +540,7 @@ int unit_deserialize(Unit *u, FILE *f, FDSet *fds);
 
 int unit_add_node_link(Unit *u, const char *what, bool wants);
 
-int unit_coldplug(Unit *u, Hashmap *deferred_work);
+int unit_coldplug(Unit *u);
 
 void unit_status_printf(Unit *u, const char *status, const char *unit_status_msg_format) _printf_(3, 0);
 



More information about the systemd-commits mailing list