snapshot: snapshots are just a special kind of transient units now
This commit is contained in:
+16
-14
@@ -40,6 +40,7 @@ static void snapshot_init(Unit *u) {
|
||||
|
||||
UNIT(s)->ignore_on_isolate = true;
|
||||
UNIT(s)->ignore_on_snapshot = true;
|
||||
UNIT(s)->allow_isolate = true;
|
||||
}
|
||||
|
||||
static void snapshot_set_state(Snapshot *s, SnapshotState state) {
|
||||
@@ -66,7 +67,7 @@ static int snapshot_load(Unit *u) {
|
||||
|
||||
/* Make sure that only snapshots created via snapshot_create()
|
||||
* can be loaded */
|
||||
if (!s->by_snapshot_create && UNIT(s)->manager->n_reloading <= 0)
|
||||
if (!u->transient && UNIT(s)->manager->n_reloading <= 0)
|
||||
return -ENOENT;
|
||||
|
||||
u->load_state = UNIT_LOADED;
|
||||
@@ -151,21 +152,24 @@ static int snapshot_deserialize_item(Unit *u, const char *key, const char *value
|
||||
if (streq(key, "state")) {
|
||||
SnapshotState state;
|
||||
|
||||
if ((state = snapshot_state_from_string(value)) < 0)
|
||||
state = snapshot_state_from_string(value);
|
||||
if (state < 0)
|
||||
log_debug("Failed to parse state value %s", value);
|
||||
else
|
||||
s->deserialized_state = state;
|
||||
|
||||
} else if (streq(key, "cleanup")) {
|
||||
|
||||
if ((r = parse_boolean(value)) < 0)
|
||||
r = parse_boolean(value);
|
||||
if (r < 0)
|
||||
log_debug("Failed to parse cleanup value %s", value);
|
||||
else
|
||||
s->cleanup = r;
|
||||
|
||||
} else if (streq(key, "wants")) {
|
||||
|
||||
if ((r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, value, NULL, true)) < 0)
|
||||
r = unit_add_two_dependencies_by_name(u, UNIT_AFTER, UNIT_WANTS, value, NULL, true);
|
||||
if (r < 0)
|
||||
return r;
|
||||
} else
|
||||
log_debug("Unknown serialization key '%s'", key);
|
||||
@@ -186,9 +190,9 @@ _pure_ static const char *snapshot_sub_state_to_string(Unit *u) {
|
||||
}
|
||||
|
||||
int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Snapshot **_s) {
|
||||
Iterator i;
|
||||
_cleanup_free_ char *n = NULL;
|
||||
Unit *other, *u = NULL;
|
||||
char *n = NULL;
|
||||
Iterator i;
|
||||
int r;
|
||||
const char *k;
|
||||
|
||||
@@ -221,24 +225,22 @@ int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Sn
|
||||
break;
|
||||
|
||||
free(n);
|
||||
n = NULL;
|
||||
}
|
||||
|
||||
name = n;
|
||||
}
|
||||
|
||||
r = manager_load_unit_prepare(m, name, NULL, e, &u);
|
||||
free(n);
|
||||
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
|
||||
SNAPSHOT(u)->by_snapshot_create = true;
|
||||
u->transient = true;
|
||||
manager_dispatch_load_queue(m);
|
||||
assert(u->load_state == UNIT_LOADED);
|
||||
|
||||
HASHMAP_FOREACH_KEY(other, k, m->units, i) {
|
||||
|
||||
if (other->ignore_on_snapshot)
|
||||
if (other->ignore_on_snapshot ||
|
||||
other->transient)
|
||||
continue;
|
||||
|
||||
if (k != other->id)
|
||||
@@ -251,12 +253,12 @@ int snapshot_create(Manager *m, const char *name, bool cleanup, DBusError *e, Sn
|
||||
if (!UNIT_IS_ACTIVE_OR_ACTIVATING(unit_active_state(other)))
|
||||
continue;
|
||||
|
||||
if ((r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, other, true)) < 0)
|
||||
r = unit_add_two_dependencies(u, UNIT_AFTER, UNIT_WANTS, other, true);
|
||||
if (r < 0)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
SNAPSHOT(u)->cleanup = cleanup;
|
||||
u->allow_isolate = true;
|
||||
*_s = SNAPSHOT(u);
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -38,7 +38,6 @@ struct Snapshot {
|
||||
SnapshotState state, deserialized_state;
|
||||
|
||||
bool cleanup;
|
||||
bool by_snapshot_create:1;
|
||||
};
|
||||
|
||||
extern const UnitVTable snapshot_vtable;
|
||||
|
||||
Reference in New Issue
Block a user