From: Hanna Reitz <hreitz@redhat.com>
To: qemu-block@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>, Hanna Reitz <hreitz@redhat.com>,
Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>,
Eric Blake <eblake@redhat.com>,
qemu-devel@nongnu.org
Subject: [PATCH v5 07/13] job: Do not soft-cancel after a job is done
Date: Wed, 6 Oct 2021 17:19:34 +0200 [thread overview]
Message-ID: <20211006151940.214590-8-hreitz@redhat.com> (raw)
In-Reply-To: <20211006151940.214590-1-hreitz@redhat.com>
The only job that supports a soft cancel mode is the mirror job, and in
such a case it resets its .cancelled field before it leaves its .run()
function, so it does not really count as cancelled.
However, it is possible to cancel the job after .run() returns and
before job_exit() (which is run in the main loop) is executed. Then,
.cancelled would still be true and the job would count as cancelled.
This does not seem to be in the interest of the mirror job, so adjust
job_cancel_async() to not set .cancelled in such a case, and
job_cancel() to not invoke job_completed_txn_abort().
Signed-off-by: Hanna Reitz <hreitz@redhat.com>
---
job.c | 25 +++++++++++++++++++++----
1 file changed, 21 insertions(+), 4 deletions(-)
diff --git a/job.c b/job.c
index 81c016eb10..44e741ebd4 100644
--- a/job.c
+++ b/job.c
@@ -734,9 +734,19 @@ static void job_cancel_async(Job *job, bool force)
assert(job->pause_count > 0);
job->pause_count--;
}
- job->cancelled = true;
- /* To prevent 'force == false' overriding a previous 'force == true' */
- job->force_cancel |= force;
+
+ /*
+ * Ignore soft cancel requests after the job is already done
+ * (We will still invoke job->driver->cancel() above, but if the
+ * job driver supports soft cancelling and the job is done, that
+ * should be a no-op, too. We still call it so it can override
+ * @force.)
+ */
+ if (force || !job->deferred_to_main_loop) {
+ job->cancelled = true;
+ /* To prevent 'force == false' overriding a previous 'force == true' */
+ job->force_cancel |= force;
+ }
}
static void job_completed_txn_abort(Job *job)
@@ -963,7 +973,14 @@ void job_cancel(Job *job, bool force)
if (!job_started(job)) {
job_completed(job);
} else if (job->deferred_to_main_loop) {
- job_completed_txn_abort(job);
+ /*
+ * job_cancel_async() ignores soft-cancel requests for jobs
+ * that are already done (i.e. deferred to the main loop). We
+ * have to check again whether the job is really cancelled.
+ */
+ if (job_is_cancelled(job)) {
+ job_completed_txn_abort(job);
+ }
} else {
job_enter(job);
}
--
2.31.1
next prev parent reply other threads:[~2021-10-06 15:23 UTC|newest]
Thread overview: 21+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-10-06 15:19 [PATCH v5 00/13] mirror: Handle errors after READY cancel Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 01/13] job: Context changes in job_completed_txn_abort() Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 02/13] mirror: Keep s->synced on error Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 03/13] mirror: Drop s->synced Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 04/13] job: Force-cancel jobs in a failed transaction Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 05/13] job: @force parameter for job_cancel_sync() Hanna Reitz
2021-10-06 15:28 ` Eric Blake
2021-10-07 8:19 ` Vladimir Sementsov-Ogievskiy
2021-10-06 15:19 ` [PATCH v5 06/13] jobs: Give Job.force_cancel more meaning Hanna Reitz
2021-10-06 15:19 ` Hanna Reitz [this message]
2021-10-06 21:18 ` [PATCH v5 07/13] job: Do not soft-cancel after a job is done Eric Blake
2021-10-07 8:31 ` Vladimir Sementsov-Ogievskiy
2021-10-06 15:19 ` [PATCH v5 08/13] job: Add job_cancel_requested() Hanna Reitz
2021-10-06 21:24 ` Eric Blake
2021-10-07 8:33 ` Vladimir Sementsov-Ogievskiy
2021-10-06 15:19 ` [PATCH v5 09/13] mirror: Use job_is_cancelled() Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 10/13] mirror: Check job_is_cancelled() earlier Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 11/13] mirror: Stop active mirroring after force-cancel Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 12/13] mirror: Do not clear .cancelled Hanna Reitz
2021-10-06 15:19 ` [PATCH v5 13/13] iotests: Add mirror-ready-cancel-error test Hanna Reitz
2021-10-07 8:39 ` [PATCH v5 00/13] mirror: Handle errors after READY cancel Vladimir Sementsov-Ogievskiy
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20211006151940.214590-8-hreitz@redhat.com \
--to=hreitz@redhat.com \
--cc=eblake@redhat.com \
--cc=kwolf@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@virtuozzo.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).