manager: drop all pending jobs when isolating

This commit is contained in:
Lennart Poettering 2011-04-14 02:23:51 +02:00
parent c8f4d7642b
commit 4fe60156fc
1 changed files with 16 additions and 2 deletions

View File

@ -1187,13 +1187,27 @@ static void transaction_minimize_impact(Manager *m) {
} while (again);
}
static int transaction_apply(Manager *m) {
static int transaction_apply(Manager *m, JobMode mode) {
Iterator i;
Job *j;
int r;
/* Moves the transaction jobs to the set of active jobs */
if (mode == JOB_ISOLATE) {
/* When isolating first kill all installed jobs which
* aren't part of the new transaction */
HASHMAP_FOREACH(j, m->jobs, i) {
assert(j->installed);
if (hashmap_get(m->transaction_jobs, j->unit))
continue;
job_finish_and_invalidate(j, JOB_CANCELED);
}
}
HASHMAP_FOREACH(j, m->transaction_jobs, i) {
/* Assume merged */
assert(!j->transaction_prev);
@ -1322,7 +1336,7 @@ static int transaction_activate(Manager *m, JobMode mode, DBusError *e) {
}
/* Tenth step: apply changes */
if ((r = transaction_apply(m)) < 0) {
if ((r = transaction_apply(m, mode)) < 0) {
log_warning("Failed to apply transaction: %s", strerror(-r));
goto rollback;
}