[libvirt] [PATCH v2 20/25] qemu: Implement backup job APIs and qemu handling

Eric Blake eblake at redhat.com
Thu Dec 5 18:13:08 UTC 2019


[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

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.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the libvir-list mailing list