From: Kevin Wolf <kwolf@redhat.com>
To: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
Cc: qemu-block@nongnu.org, qemu-devel@nongnu.org, hreitz@redhat.com,
jsnow@redhat.com, den@openvz.org, f.ebner@proxmox.com
Subject: Re: [PATCH v2 1/3] block/commit: implement final flush
Date: Mon, 29 Jul 2024 14:25:12 +0200 [thread overview]
Message-ID: <ZqeKKCWxhoVnGKWV@redhat.com> (raw)
In-Reply-To: <c4ae737c-853d-4a0d-8f7c-e5502c824bd7@yandex-team.ru>
Am 19.07.2024 um 12:35 hat Vladimir Sementsov-Ogievskiy geschrieben:
> On 18.07.24 22:22, Kevin Wolf wrote:
> > Am 26.06.2024 um 16:50 hat Vladimir Sementsov-Ogievskiy geschrieben:
> > > Actually block job is not completed without the final flush. It's
> > > rather unexpected to have broken target when job was successfully
> > > completed long ago and now we fail to flush or process just
> > > crashed/killed.
> > >
> > > Mirror job already has mirror_flush() for this. So, it's OK.
> > >
> > > Do this for commit job too.
> > >
> > > Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@yandex-team.ru>
> > > ---
> > > block/commit.c | 41 +++++++++++++++++++++++++++--------------
> > > 1 file changed, 27 insertions(+), 14 deletions(-)
> > >
> > > diff --git a/block/commit.c b/block/commit.c
> > > index 7c3fdcb0ca..81971692a2 100644
> > > --- a/block/commit.c
> > > +++ b/block/commit.c
> > > @@ -134,6 +134,7 @@ static int coroutine_fn commit_run(Job *job, Error **errp)
> > > int64_t n = 0; /* bytes */
> > > QEMU_AUTO_VFREE void *buf = NULL;
> > > int64_t len, base_len;
> > > + bool need_final_flush = true;
> > > len = blk_co_getlength(s->top);
> > > if (len < 0) {
> > > @@ -155,8 +156,8 @@ static int coroutine_fn commit_run(Job *job, Error **errp)
> > > buf = blk_blockalign(s->top, COMMIT_BUFFER_SIZE);
> > > - for (offset = 0; offset < len; offset += n) {
> > > - bool copy;
> > > + for (offset = 0; offset < len || need_final_flush; offset += n) {
> >
> > In general, the control flow would be nicer to read if the final flush
> > weren't integrated into the loop, but just added after it.
> >
> > But I assume this is pretty much required for pausing the job during
> > error handling in the final flush if you don't want to duplicate a lot
> > of the logic into a second loop?
>
> Right, that's the reason.
This would probably be the right solution if it affected only commit.
But I've thought a bit more about this and given that the same thing
happens in all of the block jobs, I'm really wondering if introducing a
block job helper function wouldn't be better, so that each block job
could just add something like this after its main loop:
do {
ret = blk_co_flush();
} while (block_job_handle_error(job, ret));
And the helper would call block_job_error_action(), stop the job if
necessary, check if it's cancelled, include a pause point etc.
Kevin
next prev parent reply other threads:[~2024-07-29 12:25 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-06-26 14:50 [PATCH v2 0/3] block-jobs: add final flush Vladimir Sementsov-Ogievskiy
2024-06-26 14:50 ` [PATCH v2 1/3] block/commit: implement " Vladimir Sementsov-Ogievskiy
2024-07-18 19:22 ` Kevin Wolf
2024-07-19 10:35 ` Vladimir Sementsov-Ogievskiy
2024-07-29 12:25 ` Kevin Wolf [this message]
2024-08-02 11:12 ` Vladimir Sementsov-Ogievskiy
2024-06-26 14:50 ` [PATCH v2 2/3] block/stream: " Vladimir Sementsov-Ogievskiy
2024-06-26 14:50 ` [PATCH v2 3/3] block/backup: " 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=ZqeKKCWxhoVnGKWV@redhat.com \
--to=kwolf@redhat.com \
--cc=den@openvz.org \
--cc=f.ebner@proxmox.com \
--cc=hreitz@redhat.com \
--cc=jsnow@redhat.com \
--cc=qemu-block@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=vsementsov@yandex-team.ru \
/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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.