[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [libvirt] [PATCH v2 20/25] qemu: Implement backup job APIs and qemu
From: |
Vladimir Sementsov-Ogievskiy |
Subject: |
Re: [libvirt] [PATCH v2 20/25] qemu: Implement backup job APIs and qemu handling |
Date: |
Fri, 6 Dec 2019 14:38:30 +0000 |
05.12.2019 21:13, Eric Blake wrote:
> [adding some qemu visibility]
>
> On 12/5/19 7:34 AM, Peter Krempa wrote:
>
>>>> + if (!(mergebitmapsstore = virJSONValueCopy(mergebitmaps)))
>>>> + return -1;
>>>> +
>>>> + if (qemuMonitorTransactionBitmapAdd(actions,
>>>> + dd->domdisk->src->nodeformat,
>>>> + dd->incrementalBitmap,
>>>> + false,
>>>> + true) < 0)
>>>> + return -1;
>>>> +
>>>> + if (qemuMonitorTransactionBitmapMerge(actions,
>>>> + dd->domdisk->src->nodeformat,
>>>> + dd->incrementalBitmap,
>>>> + &mergebitmaps) < 0)
>>>> + return -1;
>>>> +
>>>> + if (qemuMonitorTransactionBitmapAdd(actions,
>>>> + dd->store->nodeformat,
>>>> + dd->incrementalBitmap,
>>>> + false,
>>>> + true) < 0)
>>>> + return -1;
>>>
>>> Why do we need two of these calls?
>>> /me reads on
>>>
>>>> +
>>>> + if (qemuMonitorTransactionBitmapMerge(actions,
>>>> + dd->store->nodeformat,
>>>> + dd->incrementalBitmap,
>>>> + &mergebitmapsstore) < 0)
>>>> + return -1;
>>>
>>> okay, it looks like you are trying to merge the same bitmap into two
>>> different merge commands, which will all be part of the same transaction. I
>>> guess it would be helpful to see a trace of the transaction in action to see
>>> if we can simplify it (using 2 instead of 4 qemuMonitor* commands).
>>
>> This is required because the backup blockjob requires the bitmap to be
>> present on the source ('device') image of the backup. The same also
>> applies for the image exported by NBD. The catch is that we expose the
>> scratch file via NBD which is actually the target image of the backup.
>> This means that in case of a pull backup we need two instances of the
>> bitmap so both the block job and the NBD server can use them. Arguably
>> there's a possible simplification here for push-mode backups where the
>> target bitmap doesn't make sense.
>
> The backup job requires the bitmap to be on the source, but the qemu NBD
> export code only requires the bitmap to be locatable somewhere on the qemu
> NBD server requires the bitmap to be discoverable from anywhere on the chain,
> and since the temporary target of the block job has the source image as its
> backing file, that should be the case. That is:
>
> base <- active <- temp
> |
> bitmap0
>
> looking up [active, bitmap0] or [temp, bitmap0] should both succeed; we need
> the former for the blockjob, and the latter for the NBD export.
>
> If the NBD export _can't_ find bitmap0 through the backing chain, that may be
> a symptom of the problem that Max has been trying to fix (his upcoming v7
> "deal with filters" is hinted at here, but will not be in 4.2):
> https://lists.gnu.org/archive/html/qemu-devel/2019-11/msg04520.html
these problems will hit if some filters are in use, like throttling,
copy-on-read, etc. They use file child, which breaks backing chains. But normal
backing chains should work well.
>
> In my original implementation, I did not need a duplicated bitmap in the temp
> file. But that was pre-blockdev. Are we really hitting filter limitations
> in qemu where the use of blockdev is preventing [temp, bitmap0] from finding
> the bitmap across the backing chain? If so, we should fix that in qemu - but
> we're so late for 4.2, that I guess libvirt will have to work around it.
>
--
Best regards,
Vladimir