[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


Reply via email to