mirror of
https://github.com/systemd/systemd.git
synced 2024-12-23 21:35:11 +03:00
job: fix deserialization of jobs: do not ignore ordering
This commit is contained in:
parent
f80781eaf9
commit
cebe0d41e4
1
TODO
1
TODO
@ -17,6 +17,7 @@ F15:
|
||||
* hook emergency.target into local-fs.target in some way as OnFailure with isolate
|
||||
|
||||
* bind mounts are ignored
|
||||
https://bugzilla.redhat.com/show_bug.cgi?id=682662
|
||||
|
||||
* 0595f9a1c182a84581749823ef47c5f292e545f9 is borked, freezes shutdown
|
||||
(path: after installing inotify watches, recheck file again to fix race)
|
||||
|
@ -313,7 +313,7 @@ bool job_is_runnable(Job *j) {
|
||||
* type. */
|
||||
|
||||
/* First check if there is an override */
|
||||
if (j->ignore_deps)
|
||||
if (j->ignore_order)
|
||||
return true;
|
||||
|
||||
if (j->type == JOB_START ||
|
||||
@ -694,7 +694,8 @@ static const char* const job_mode_table[_JOB_MODE_MAX] = {
|
||||
[JOB_FAIL] = "fail",
|
||||
[JOB_REPLACE] = "replace",
|
||||
[JOB_ISOLATE] = "isolate",
|
||||
[JOB_IGNORE_DEPENDENCIES] = "ignore-dependencies"
|
||||
[JOB_IGNORE_DEPENDENCIES] = "ignore-dependencies",
|
||||
[JOB_IGNORE_REQUIREMENTS] = "ignore-requirements"
|
||||
};
|
||||
|
||||
DEFINE_STRING_TABLE_LOOKUP(job_mode, JobMode);
|
||||
|
11
src/job.h
11
src/job.h
@ -64,10 +64,11 @@ enum JobState {
|
||||
};
|
||||
|
||||
enum JobMode {
|
||||
JOB_FAIL,
|
||||
JOB_REPLACE,
|
||||
JOB_ISOLATE,
|
||||
JOB_IGNORE_DEPENDENCIES,
|
||||
JOB_FAIL, /* Fail if a conflicting job is already queued */
|
||||
JOB_REPLACE, /* Replace an existing conflicting job */
|
||||
JOB_ISOLATE, /* Start a unit, and stop all others */
|
||||
JOB_IGNORE_DEPENDENCIES, /* Ignore both requirement and ordering dependencies */
|
||||
JOB_IGNORE_REQUIREMENTS, /* Ignore requirement dependencies */
|
||||
_JOB_MODE_MAX,
|
||||
_JOB_MODE_INVALID = -1
|
||||
};
|
||||
@ -130,7 +131,7 @@ struct Job {
|
||||
bool override:1;
|
||||
bool in_dbus_queue:1;
|
||||
bool sent_dbus_new_signal:1;
|
||||
bool ignore_deps:1;
|
||||
bool ignore_order:1;
|
||||
};
|
||||
|
||||
Job* job_new(Manager *m, JobType type, Unit *unit);
|
||||
|
@ -1423,7 +1423,8 @@ static int transaction_add_job_and_dependencies(
|
||||
bool matters,
|
||||
bool override,
|
||||
bool conflicts,
|
||||
bool ignore_deps,
|
||||
bool ignore_requirements,
|
||||
bool ignore_order,
|
||||
DBusError *e,
|
||||
Job **_ret) {
|
||||
Job *ret;
|
||||
@ -1471,20 +1472,20 @@ static int transaction_add_job_and_dependencies(
|
||||
if (!(ret = transaction_add_one_job(m, type, unit, override, &is_new)))
|
||||
return -ENOMEM;
|
||||
|
||||
ret->ignore_deps = ret->ignore_deps || ignore_deps;
|
||||
ret->ignore_order = ret->ignore_order || ignore_order;
|
||||
|
||||
/* Then, add a link to the job. */
|
||||
if (!job_dependency_new(by, ret, matters, conflicts))
|
||||
return -ENOMEM;
|
||||
|
||||
if (is_new && !ignore_deps) {
|
||||
if (is_new && !ignore_requirements) {
|
||||
Set *following;
|
||||
|
||||
/* If we are following some other unit, make sure we
|
||||
* add all dependencies of everybody following. */
|
||||
if (unit_following_set(ret->unit, &following) > 0) {
|
||||
SET_FOREACH(dep, following, i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, false, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, false, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r));
|
||||
|
||||
if (e)
|
||||
@ -1497,7 +1498,7 @@ static int transaction_add_job_and_dependencies(
|
||||
/* Finally, recursively add in all dependencies. */
|
||||
if (type == JOB_START || type == JOB_RELOAD_OR_START) {
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRES], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
|
||||
@ -1506,7 +1507,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_BIND_TO], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1516,7 +1517,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRES_OVERRIDABLE], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !override, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, !override, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r));
|
||||
|
||||
if (e)
|
||||
@ -1524,7 +1525,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_WANTS], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, false, false, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_START, dep, ret, false, false, false, false, ignore_order, e, NULL)) < 0) {
|
||||
log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r));
|
||||
|
||||
if (e)
|
||||
@ -1532,7 +1533,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUISITE], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1542,7 +1543,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUISITE_OVERRIDABLE], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_VERIFY_ACTIVE, dep, ret, !override, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r));
|
||||
|
||||
if (e)
|
||||
@ -1550,7 +1551,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_CONFLICTS], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, override, true, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, true, override, true, false, ignore_order, e, NULL)) < 0) {
|
||||
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1560,7 +1561,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_CONFLICTED_BY], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, false, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, dep, ret, false, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
log_warning("Cannot add dependency job for unit %s, ignoring: %s", dep->meta.id, bus_error(e, r));
|
||||
|
||||
if (e)
|
||||
@ -1570,7 +1571,7 @@ static int transaction_add_job_and_dependencies(
|
||||
} else if (type == JOB_STOP || type == JOB_RESTART || type == JOB_TRY_RESTART) {
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_REQUIRED_BY], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1580,7 +1581,7 @@ static int transaction_add_job_and_dependencies(
|
||||
}
|
||||
|
||||
SET_FOREACH(dep, ret->unit->meta.dependencies[UNIT_BOUND_BY], i)
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, e, NULL)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, dep, ret, true, override, false, false, ignore_order, e, NULL)) < 0) {
|
||||
|
||||
if (r != -EBADR)
|
||||
goto fail;
|
||||
@ -1627,7 +1628,7 @@ static int transaction_add_isolate_jobs(Manager *m) {
|
||||
if (hashmap_get(m->transaction_jobs, u))
|
||||
continue;
|
||||
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, u, NULL, true, false, false, false, NULL, NULL)) < 0)
|
||||
if ((r = transaction_add_job_and_dependencies(m, JOB_STOP, u, NULL, true, false, false, false, false, NULL, NULL)) < 0)
|
||||
log_warning("Cannot add isolate job for unit %s, ignoring: %s", u->meta.id, strerror(-r));
|
||||
}
|
||||
|
||||
@ -1655,7 +1656,9 @@ int manager_add_job(Manager *m, JobType type, Unit *unit, JobMode mode, bool ove
|
||||
|
||||
log_debug("Trying to enqueue job %s/%s/%s", unit->meta.id, job_type_to_string(type), job_mode_to_string(mode));
|
||||
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, unit, NULL, true, override, false, mode == JOB_IGNORE_DEPENDENCIES, e, &ret)) < 0) {
|
||||
if ((r = transaction_add_job_and_dependencies(m, type, unit, NULL, true, override, false,
|
||||
mode == JOB_IGNORE_DEPENDENCIES || mode == JOB_IGNORE_REQUIREMENTS,
|
||||
mode == JOB_IGNORE_DEPENDENCIES, e, &ret)) < 0) {
|
||||
transaction_abort(m);
|
||||
return r;
|
||||
}
|
||||
|
@ -2242,7 +2242,7 @@ int unit_coldplug(Unit *u) {
|
||||
return r;
|
||||
|
||||
if (u->meta.deserialized_job >= 0) {
|
||||
if ((r = manager_add_job(u->meta.manager, u->meta.deserialized_job, u, JOB_IGNORE_DEPENDENCIES, false, NULL, NULL)) < 0)
|
||||
if ((r = manager_add_job(u->meta.manager, u->meta.deserialized_job, u, JOB_IGNORE_REQUIREMENTS, false, NULL, NULL)) < 0)
|
||||
return r;
|
||||
|
||||
u->meta.deserialized_job = _JOB_TYPE_INVALID;
|
||||
|
Loading…
Reference in New Issue
Block a user