diff options
author | Lennart Poettering <lennart@poettering.net> | 2010-08-05 20:39:45 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2010-08-05 20:39:45 +0200 |
commit | 674a6e4d0cae372f34df94dfab2513e071d5dc58 (patch) | |
tree | 1664efd383b7a26f340225d0cbf930f46dc1ff4d /src/manager.c | |
parent | 30609d9c187331640125d6b7e3c650330304b383 (diff) |
manager: when breaking ordering cycle show full cycle loop
Diffstat (limited to 'src/manager.c')
-rw-r--r-- | src/manager.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/manager.c b/src/manager.c index bdb2b8ba3e..7dbc448269 100644 --- a/src/manager.c +++ b/src/manager.c @@ -885,7 +885,7 @@ static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned /* Have we seen this before? */ if (j->generation == generation) { - Job *k; + Job *k, *delete; /* If the marker is NULL we have been here already and * decided the job was loop-free from here. Hence @@ -901,17 +901,17 @@ static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned * in there. */ log_warning("Found ordering cycle on %s/%s", j->unit->meta.id, job_type_to_string(j->type)); + delete = NULL; for (k = from; k; k = ((k->generation == generation && k->marker != k) ? k->marker : NULL)) { log_info("Walked on cycle path to %s/%s", k->unit->meta.id, job_type_to_string(k->type)); - if (!k->installed && + if (!delete && + !k->installed && !unit_matters_to_anchor(k->unit, k)) { /* Ok, we can drop this one, so let's * do so. */ - log_warning("Breaking order cycle by deleting job %s/%s", k->unit->meta.id, job_type_to_string(k->type)); - transaction_delete_unit(m, k->unit); - return -EAGAIN; + delete = k; } /* Check if this in fact was the beginning of @@ -920,6 +920,13 @@ static int transaction_verify_order_one(Manager *m, Job *j, Job *from, unsigned break; } + + if (delete) { + log_warning("Breaking ordering cycle by deleting job %s/%s", k->unit->meta.id, job_type_to_string(k->type)); + transaction_delete_unit(m, delete->unit); + return -EAGAIN; + } + log_error("Unable to break cycle"); dbus_set_error(e, BUS_ERROR_TRANSACTION_ORDER_IS_CYCLIC, "Transaction order is cyclic. See logs for details."); |