From: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
To: Max Reitz <mreitz@redhat.com>, qemu-block@nongnu.org
Cc: qemu-devel@nongnu.org, Kevin Wolf <kwolf@redhat.com>,
John Snow <jsnow@redhat.com>
Subject: Re: [PATCH for-6.1? v2 4/7] jobs: Give Job.force_cancel more meaning
Date: Tue, 27 Jul 2021 15:40:40 +0300 [thread overview]
Message-ID: <578263d0-5c4b-c5bc-b649-fcd14bdccb19@virtuozzo.com> (raw)
In-Reply-To: <20210726144613.954844-5-mreitz@redhat.com>
26.07.2021 17:46, Max Reitz wrote:
> We largely have two cancel modes for jobs:
>
> First, there is actual cancelling. The job is terminated as soon as
> possible, without trying to reach a consistent result.
>
> Second, we have mirror in the READY state. Technically, the job is not
> really cancelled, but it just is a different completion mode. The job
> can still run for an indefinite amount of time while it tries to reach a
> consistent result.
>
> We want to be able to clearly distinguish which cancel mode a job is in
> (when it has been cancelled). We can use Job.force_cancel for this, but
> right now it only reflects cancel requests from the user with
> force=true, but clearly, jobs that do not even distinguish between
> force=false and force=true are effectively always force-cancelled.
>
> So this patch has Job.force_cancel signify whether the job will
> terminate as soon as possible (force_cancel=true) or whether it will
> effectively remain running despite being "cancelled"
> (force_cancel=false).
>
> To this end, we let jobs that provide JobDriver.cancel() tell the
> generic job code whether they will terminate as soon as possible or not,
> and for jobs that do not provide that method we assume they will.
>
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
> include/qemu/job.h | 11 ++++++++++-
> block/backup.c | 3 ++-
> block/mirror.c | 24 ++++++++++++++++++------
> job.c | 6 +++++-
> 4 files changed, 35 insertions(+), 9 deletions(-)
>
> diff --git a/include/qemu/job.h b/include/qemu/job.h
> index 5e8edbc2c8..8aa90f7395 100644
> --- a/include/qemu/job.h
> +++ b/include/qemu/job.h
> @@ -253,8 +253,17 @@ struct JobDriver {
>
> /**
> * If the callback is not NULL, it will be invoked in job_cancel_async
> + *
> + * This function must return true if the job will be cancelled
> + * immediately without any further I/O (mandatory if @force is
> + * true), and false otherwise. This lets the generic job layer
> + * know whether a job has been truly (force-)cancelled, or whether
> + * it is just in a special completion mode (like mirror after
> + * READY).
> + * (If the callback is NULL, the job is assumed to terminate
> + * without I/O.)
> */
> - void (*cancel)(Job *job, bool force);
> + bool (*cancel)(Job *job, bool force);
>
>
> /** Called when the job is freed */
> diff --git a/block/backup.c b/block/backup.c
> index bd3614ce70..513e1c8a0b 100644
> --- a/block/backup.c
> +++ b/block/backup.c
> @@ -331,11 +331,12 @@ static void coroutine_fn backup_set_speed(BlockJob *job, int64_t speed)
> }
> }
>
> -static void backup_cancel(Job *job, bool force)
> +static bool backup_cancel(Job *job, bool force)
> {
> BackupBlockJob *s = container_of(job, BackupBlockJob, common.job);
>
> bdrv_cancel_in_flight(s->target_bs);
> + return true;
> }
>
> static const BlockJobDriver backup_job_driver = {
> diff --git a/block/mirror.c b/block/mirror.c
> index fcb7b65f93..e93631a9f6 100644
> --- a/block/mirror.c
> +++ b/block/mirror.c
> @@ -1087,9 +1087,7 @@ static int coroutine_fn mirror_run(Job *job, Error **errp)
> trace_mirror_before_sleep(s, cnt, job_is_ready(&s->common.job),
> delay_ns);
> job_sleep_ns(&s->common.job, delay_ns);
> - if (job_is_cancelled(&s->common.job) &&
> - (!job_is_ready(&s->common.job) || s->common.job.force_cancel))
> - {
> + if (job_is_cancelled(&s->common.job) && s->common.job.force_cancel) {
Seems, it could it be reduced to
if (s->common.job.force_cancel) {
> break;
> }
> s->last_pause_ns = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
> @@ -1102,7 +1100,7 @@ immediate_exit:
> * the target is a copy of the source.
> */
> assert(ret < 0 ||
> - ((s->common.job.force_cancel || !job_is_ready(&s->common.job)) &&
> + (s->common.job.force_cancel &&
and here
> job_is_cancelled(&s->common.job)));
> assert(need_drain);
> mirror_wait_for_all_io(s);
> @@ -1188,14 +1186,27 @@ static bool mirror_drained_poll(BlockJob *job)
> return !!s->in_flight;
> }
>
anyway:
Reviewed-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
--
Best regards,
Vladimir
next prev parent reply other threads:[~2021-07-27 12:47 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-26 14:46 [PATCH for-6.1? v2 0/7] mirror: Handle errors after READY cancel Max Reitz
2021-07-26 14:46 ` [PATCH for-6.1? v2 1/7] mirror: Keep s->synced on error Max Reitz
2021-07-26 14:46 ` [PATCH for-6.1? v2 2/7] mirror: Drop s->synced Max Reitz
2021-07-26 15:26 ` Eric Blake
2021-07-27 11:41 ` Vladimir Sementsov-Ogievskiy
2021-07-26 14:46 ` [PATCH for-6.1? v2 3/7] job: @force parameter for job_cancel_sync{, _all}() Max Reitz
2021-08-03 14:00 ` [PATCH for-6.1? v2 3/7] job: @force parameter for job_cancel_sync{,_all}() Kevin Wolf
2021-07-26 14:46 ` [PATCH for-6.1? v2 4/7] jobs: Give Job.force_cancel more meaning Max Reitz
2021-07-26 21:38 ` Eric Blake
2021-07-27 12:40 ` Vladimir Sementsov-Ogievskiy [this message]
2021-07-26 14:46 ` [PATCH for-6.1? v2 5/7] job: Add job_cancel_requested() Max Reitz
2021-07-27 13:04 ` Vladimir Sementsov-Ogievskiy
2021-07-27 15:39 ` Max Reitz
2021-07-27 15:47 ` Vladimir Sementsov-Ogievskiy
2021-08-02 10:23 ` Max Reitz
2021-08-03 12:35 ` Vladimir Sementsov-Ogievskiy
2021-08-03 14:25 ` Kevin Wolf
2021-08-04 8:07 ` Max Reitz
2021-08-04 10:34 ` Kevin Wolf
2021-08-04 11:00 ` Peter Krempa
2021-08-04 14:15 ` Max Reitz
2021-07-26 14:46 ` [PATCH for-6.1? v2 6/7] mirror: Check job_is_cancelled() earlier Max Reitz
2021-07-27 13:13 ` Vladimir Sementsov-Ogievskiy
2021-07-27 15:40 ` Max Reitz
2021-08-03 14:34 ` Kevin Wolf
2021-08-04 8:25 ` Max Reitz
2021-08-04 9:48 ` Kevin Wolf
2021-08-04 10:12 ` Max Reitz
2021-07-26 14:46 ` [PATCH for-6.1? v2 7/7] iotests: Add mirror-ready-cancel-error test Max Reitz
2021-07-27 13:24 ` Vladimir Sementsov-Ogievskiy
2021-08-03 14:36 ` [PATCH for-6.1? v2 0/7] mirror: Handle errors after READY cancel Kevin Wolf
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=578263d0-5c4b-c5bc-b649-fcd14bdccb19@virtuozzo.com \
--to=vsementsov@virtuozzo.com \
--cc=jsnow@redhat.com \
--cc=kwolf@redhat.com \
--cc=mreitz@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
/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).