From 2a39b91459a4c27985d9a58309c0fda25f3cd397 Mon Sep 17 00:00:00 2001 From: Richard Phibel Date: Thu, 6 Jul 2023 14:03:35 +0200 Subject: [PATCH] service: fix for RestartMode=direct option With the fix done in PR28215, the unit restart job is created with type JOB_START. Because of that, it is not properly merged anymore with the old one: the merged job has state JOB_RUNNING. It should have state JOB_WAITING. I think that the old job is not cleaned up because we don't go through the failed state. With this fix, the merged job is properly created with state JOB_WAITING. --- src/core/job.c | 4 ++-- src/core/job.h | 2 +- src/core/transaction.c | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/core/job.c b/src/core/job.c index 3d5e4e42d12..95e71c48e23 100644 --- a/src/core/job.c +++ b/src/core/job.c @@ -217,7 +217,7 @@ static void job_merge_into_installed(Job *j, Job *other) { j->ignore_order = j->ignore_order || other->ignore_order; } -Job* job_install(Job *j) { +Job* job_install(Job *j, JobMode mode) { Job **pj; Job *uj; @@ -235,7 +235,7 @@ Job* job_install(Job *j) { /* not conflicting, i.e. mergeable */ if (uj->state == JOB_WAITING || - (job_type_allows_late_merge(j->type) && job_type_is_superset(uj->type, j->type))) { + (job_type_allows_late_merge(j->type) && mode != JOB_RESTART_DEPENDENCIES && job_type_is_superset(uj->type, j->type))) { job_merge_into_installed(uj, j); log_unit_debug(uj->unit, "Merged %s/%s into installed job %s/%s as %"PRIu32, diff --git a/src/core/job.h b/src/core/job.h index d3b98d98b61..2c4fbdf4eda 100644 --- a/src/core/job.h +++ b/src/core/job.h @@ -169,7 +169,7 @@ Job* job_new(Unit *unit, JobType type); Job* job_new_raw(Unit *unit); void job_unlink(Job *job); Job* job_free(Job *job); -Job* job_install(Job *j); +Job* job_install(Job *j, JobMode mode); int job_install_deserialized(Job *j); void job_uninstall(Job *j); void job_dump(Job *j, FILE *f, const char *prefix); diff --git a/src/core/transaction.c b/src/core/transaction.c index c85bc667ceb..8b8e02f1c77 100644 --- a/src/core/transaction.c +++ b/src/core/transaction.c @@ -657,7 +657,7 @@ static int transaction_apply( /* Clean the job dependencies */ transaction_unlink_job(tr, j, false); - installed_job = job_install(j); + installed_job = job_install(j, mode); if (installed_job != j) { /* j has been merged into a previously installed job */ if (tr->anchor_job == j) -- 2.47.3