From: Max Reitz <mreitz@redhat.com>
To: John Snow <jsnow@redhat.com>,
qemu-block@nongnu.org, qemu-devel@nongnu.org
Cc: Kevin Wolf <kwolf@redhat.com>,
vsementsov@virtuozzo.com, Markus Armbruster <armbru@redhat.com>
Subject: Re: [Qemu-devel] [PATCH v2 09/11] block/backup: teach TOP to never copy unallocated regions
Date: Tue, 16 Jul 2019 18:11:20 +0200 [thread overview]
Message-ID: <79271f37-fb1e-96d5-ead1-bb7b441fceea@redhat.com> (raw)
In-Reply-To: <4045c084-572a-b274-3acb-f634162e8605@redhat.com>
[-- Attachment #1.1: Type: text/plain, Size: 3580 bytes --]
On 16.07.19 18:02, John Snow wrote:
>
>
> On 7/16/19 7:43 AM, Max Reitz wrote:
>> On 16.07.19 02:01, John Snow wrote:
>>> Presently, If sync=TOP is selected, we mark the entire bitmap as dirty.
>>> In the write notifier handler, we dutifully copy out such regions.
>>>
>>> Fix this in three parts:
>>>
>>> 1. Mark the bitmap as being initialized before the first yield.
>>> 2. After the first yield but before the backup loop, interrogate the
>>> allocation status asynchronously and initialize the bitmap.
>>> 3. Teach the write notifier to interrogate allocation status if it is
>>> invoked during bitmap initialization.
>>>
>>> As an effect of this patch, the job progress for TOP backups
>>> now behaves like this:
>>>
>>> - total progress starts at bdrv_length.
>>> - As allocation status is interrogated, total progress decreases.
>>> - As blocks are copied, current progress increases.
>>>
>>> Taken together, the floor and ceiling move to meet each other.
>>>
>>> Signed-off-by: John Snow <jsnow@redhat.com>
>>> ---
>>> block/backup.c | 78 ++++++++++++++++++++++++++++++++++++++++------
>>> block/trace-events | 1 +
>>> 2 files changed, 70 insertions(+), 9 deletions(-)
>>
>> Looks good to me but for a seemingly unrelated change:
>>
>>> diff --git a/block/backup.c b/block/backup.c
>>> index b407d57954..e28fd23f6a 100644
>>> --- a/block/backup.c
>>> +++ b/block/backup.c
>>
>> [...]
>>
>>> @@ -507,10 +565,12 @@ static int coroutine_fn backup_run(Job *job, Error **errp)
>>> * notify callback service CoW requests. */
>>> job_yield(job);
>>> }
>>> + ret = -ECANCELED;
>>
>> This one. This doesn’t look like it belongs in this patch, and I’m not
>> even sure it’s correct. Being cancelled is the normal state for
>> sync=none, so I suppose it is correct to just return 0 then.
>>
>> Max
>>
> Yeah, this is wiggly, so... yes, we can return 0 here. The job
> infrastructure machinery is going to change it to an ECANCELED for us
> anyway:
>
> job_completed
> job_update_rc
> if (!job->ret && job_is_cancelled(job)) {
> job->ret = -ECANCELED;
> }
>
> So in this case I just figured that I might as well make it explicit;
> this is an error exit.
>
> (I guess just leaving it at 0 means "whatever the job machinery thinks"
> too, which is probably also fine. The job machinery does not distinguish
> between "canceled and 0" or "canceled and < 0".)
Hm, OK. I think it should be an own patch, though.
> Since we're here, though... I was wondering if it shouldn't be the case
> that "canceling" a sync=none job should actually result in success,
> unless you force-cancel. OR, allow sync=none jobs to receive "COMPLETE"
> verbs to finish successfully, or "CANCEL" verbs to terminate with error.
That’s what I had thought. (That canceling would be a success.)
As for COMPLETE, you want it to emit a READY event right when it’s
started? :-)
> (I don't like what mirror does and don't wish to mimic it. I continue to
> dislike the idea that canceling a ready mirror job allows it to complete
> with a successful error code.)
Hm. Actually, I don’t even care that much. If the user canceled it,
they probably won’t really look at the return code anyway...
Max
>>> } else {
>>> ret = backup_loop(s);
>>> }
>>>
>>> + out:
>>> notifier_with_return_remove(&s->before_write);
>>>
>>> /* wait until pending backup_do_cow() calls have completed */
>>
[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 488 bytes --]
next prev parent reply other threads:[~2019-07-16 16:11 UTC|newest]
Thread overview: 31+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-07-16 0:01 [Qemu-devel] [PATCH v2 00/11] bitmaps: allow bitmaps to be used with full and top John Snow
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 01/11] iotests/257: add Pattern class John Snow
2019-07-16 10:08 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 02/11] iotests/257: add EmulatedBitmap class John Snow
2019-07-16 10:11 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 03/11] iotests/257: Refactor backup helpers John Snow
2019-07-16 10:33 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 04/11] block/backup: hoist bitmap check into QMP interface John Snow
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 05/11] iotests/257: test API failures John Snow
2019-07-16 10:35 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 06/11] block/backup: improve sync=bitmap work estimates John Snow
2019-07-16 10:53 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 07/11] block/backup: centralize copy_bitmap initialization John Snow
2019-07-16 10:58 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 08/11] block/backup: add backup_is_cluster_allocated John Snow
2019-07-16 11:07 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 09/11] block/backup: teach TOP to never copy unallocated regions John Snow
2019-07-16 11:43 ` Max Reitz
2019-07-16 16:02 ` John Snow
2019-07-16 16:11 ` Max Reitz [this message]
2019-07-17 18:10 ` John Snow
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 10/11] block/backup: support bitmap sync modes for non-bitmap backups John Snow
2019-07-16 5:18 ` Markus Armbruster
2019-07-16 14:49 ` John Snow
2019-07-16 11:45 ` Max Reitz
2019-07-16 0:01 ` [Qemu-devel] [PATCH v2 11/11] iotests/257: test traditional sync modes John Snow
2019-07-16 12:04 ` Max Reitz
2019-07-16 16:58 ` John Snow
2019-07-17 9:50 ` Max Reitz
2019-07-17 17:53 ` John Snow
2019-07-17 19:35 ` [Qemu-devel] [PATCH v2 00/11] bitmaps: allow bitmaps to be used with full and top John Snow
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=79271f37-fb1e-96d5-ead1-bb7b441fceea@redhat.com \
--to=mreitz@redhat.com \
--cc=armbru@redhat.com \
--cc=jsnow@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).