[PATCH 04/19] qemu: checkpoint: Introduce support for deleting checkpoints accross snapshots

Ján Tomko jtomko at redhat.com
Mon Feb 3 12:24:18 UTC 2020


On Fri, Jan 31, 2020 at 03:31:08PM +0100, Peter Krempa wrote:
>Allow deleting of checkpoints when snapshots were created along. The
>code tracks and modifies the checkpoint list so that backups can still
>be taken with such a backing chain. This unfortunately requires to
>rename few bitmaps (by copying and deleting them) in some cases.
>
>Signed-off-by: Peter Krempa <pkrempa at redhat.com>
>---
> src/qemu/qemu_checkpoint.c | 112 ++++++++++++++++++++++++++++---------
> src/qemu/qemu_checkpoint.h |   5 +-
> tests/qemublocktest.c      |  34 +++++++----
> 3 files changed, 111 insertions(+), 40 deletions(-)
>
>diff --git a/src/qemu/qemu_checkpoint.c b/src/qemu/qemu_checkpoint.c
>index e75cdd0458..087a740cf8 100644
>--- a/src/qemu/qemu_checkpoint.c
>+++ b/src/qemu/qemu_checkpoint.c
>@@ -24,6 +24,7 @@
> #include "qemu_capabilities.h"
> #include "qemu_monitor.h"
> #include "qemu_domain.h"
>+#include "qemu_block.h"
>
> #include "virerror.h"
> #include "virlog.h"
>@@ -150,39 +151,92 @@ qemuCheckpointFindActiveDiskInParent(virDomainObjPtr vm,
>
> int
> qemuCheckpointDiscardDiskBitmaps(virStorageSourcePtr src,
>+                                 virHashTablePtr blockNamedNodeData,
>                                  const char *delbitmap,
>                                  const char *parentbitmap,
>-                                 bool chkcurrent,
>-                                 virJSONValuePtr actions)
>+                                 virJSONValuePtr actions,
>+                                 const char *diskdst)
> {
>-    if (parentbitmap) {
>-        g_autoptr(virJSONValue) arr = NULL;
>+    virStorageSourcePtr n = src;
>
>-        if (!(arr = virJSONValueNewArray()))
>-            return -1;
>+    /* find the backing chain entry with bitmap named '@bitmap' */

@delbitmap

>+    while (n) {
>+        qemuBlockNamedNodeDataBitmapPtr tmp;
>
>-        if (qemuMonitorTransactionBitmapMergeSourceAddBitmap(arr,
>-                                                             src->nodeformat,
>-                                                             delbitmap) < 0)
>-            return -1;
>+        if ((tmp = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData,
>+                                                         n, delbitmap))) {
>+            break;
>+        }
>+
>+        n = n->backingStore;
>+    }
>+
>+    if (!n) {
>+        virReportError(VIR_ERR_INTERNAL_ERROR,
>+                       _("bitmap '%s' not found in backing chain of '%s'"),
>+                       delbitmap, diskdst);
>+        return -1;
>+    }
>
>-        if (chkcurrent) {
>-            if (qemuMonitorTransactionBitmapEnable(actions,
>-                                                   src->nodeformat,
>-                                                   parentbitmap) < 0)
>+    while (n) {
>+        qemuBlockNamedNodeDataBitmapPtr srcbitmap;
>+
>+        if (!(srcbitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData,
>+                                                                n, delbitmap)))
>+            break;
>+
>+        /* For the actual checkpoint deletion we will merge any bitmap into the
>+         * bitmap of the parent checkpoint (@mergebitmap) or for any image

@parentbitmap

>+         * where the parent checkpoint bitmap is not present we must rename
>+         * the bitmap of the deleted checkpoint into the bitmap of the parent
>+         * checkpoint as qemu can't currently take the allocation map and turn
>+         * it into a bitmap and thus we wouldn't be able to do a backup. */
>+        if (parentbitmap) {
>+            qemuBlockNamedNodeDataBitmapPtr dstbitmap;
>+            g_autoptr(virJSONValue) arr = NULL;
>+
>+            dstbitmap = qemuBlockNamedNodeDataGetBitmapByName(blockNamedNodeData,
>+                                                              n, parentbitmap);
>+

Reviewed-by: Ján Tomko <jtomko at redhat.com>

Jano
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 488 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20200203/2c72f39a/attachment-0001.sig>


More information about the libvir-list mailing list