core: fix assertion failure in checking a transaction with a JOB_NOP

Several functions called from transaction_activate() need to correctly
handle the case where a JOB_NOP job is being checked against a unit's
pending job. The assumption that JOB_NOP never merges with other job
types was correct, but since the job_type_is_*() functions are
implemented using the merge lookup, they need to special-case JOB_NOP
to avoid hitting assertion failures.

(cherry picked from commit 7e803f5ecf)
This commit is contained in:
Michal Schmidt
2015-01-15 21:25:39 -05:00
committed by Zbigniew Jędrzejewski-Szmek
parent 8381c0eab7
commit 52e53d5c1e
2 changed files with 13 additions and 4 deletions
+3
View File
@@ -352,6 +352,9 @@ bool job_type_is_redundant(JobType a, UnitActiveState b) {
return
b == UNIT_ACTIVATING;
case JOB_NOP:
return true;
default:
assert_not_reached("Invalid job type");
}
+10 -4
View File
@@ -49,9 +49,11 @@ enum JobType {
_JOB_TYPE_MAX_MERGING,
/* JOB_NOP can enter into a transaction, but as it won't pull in
* any dependencies, it won't have to merge with anything.
* job_install() avoids the problem of merging JOB_NOP too (it's
* special-cased, only merges with other JOB_NOPs). */
* any dependencies and it uses the special 'nop_job' slot in Unit,
* it won't have to merge with anything (except possibly into another
* JOB_NOP, previously installed). JOB_NOP is special-cased in
* job_type_is_*() functions so that the transaction can be
* activated. */
JOB_NOP = _JOB_TYPE_MAX_MERGING, /* do nothing */
_JOB_TYPE_MAX_IN_TRANSACTION,
@@ -190,11 +192,15 @@ _pure_ static inline bool job_type_is_mergeable(JobType a, JobType b) {
}
_pure_ static inline bool job_type_is_conflicting(JobType a, JobType b) {
return !job_type_is_mergeable(a, b);
return a != JOB_NOP && b != JOB_NOP && !job_type_is_mergeable(a, b);
}
_pure_ static inline bool job_type_is_superset(JobType a, JobType b) {
/* Checks whether operation a is a "superset" of b in its actions */
if (b == JOB_NOP)
return true;
if (a == JOB_NOP)
return false;
return a == job_type_lookup_merge(a, b);
}