libvirt/SOURCES/libvirt-qemu-backup-Move-fe...

214 lines
7.7 KiB
Diff

From 7dae651c45df86ce74b304535baf62013d7f527d Mon Sep 17 00:00:00 2001
Message-Id: <7dae651c45df86ce74b304535baf62013d7f527d@dist-git>
From: Peter Krempa <pkrempa@redhat.com>
Date: Tue, 23 Jun 2020 12:23:38 +0200
Subject: [PATCH] qemu: backup: Move fetching of checkpoint list for
incremental backup
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Fetch the checkpoint list for every disk specifically based on the new
per-disk 'incremental' field.
Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Eric Blake <eblake@redhat.com>
(cherry picked from commit 15c5ed8ba64e26090174d296486eacfa240af53e)
https://bugzilla.redhat.com/show_bug.cgi?id=1804593
Message-Id: <485f9933893a9890f018889a76fc48654de2c58a.1592906423.git.pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
---
src/qemu/qemu_backup.c | 109 ++++++++++++++++++++---------------------
1 file changed, 53 insertions(+), 56 deletions(-)
diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c
index adbf696de6..13e2a7412b 100644
--- a/src/qemu/qemu_backup.c
+++ b/src/qemu/qemu_backup.c
@@ -173,6 +173,50 @@ qemuBackupDiskDataCleanup(virDomainObjPtr vm,
}
+/**
+ * qemuBackupBeginCollectIncrementalCheckpoints:
+ * @vm: domain object
+ * @incrFrom: name of checkpoint representing starting point of incremental backup
+ *
+ * Returns a NULL terminated list of pointers to checkpoint definitions in
+ * chronological order starting from the 'current' checkpoint until reaching
+ * @incrFrom.
+ */
+static virDomainMomentDefPtr *
+qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm,
+ const char *incrFrom)
+{
+ virDomainMomentObjPtr n = virDomainCheckpointGetCurrent(vm->checkpoints);
+ g_autofree virDomainMomentDefPtr *incr = NULL;
+ size_t nincr = 0;
+
+ while (n) {
+ virDomainMomentDefPtr def = n->def;
+
+ if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0)
+ return NULL;
+
+ if (STREQ(def->name, incrFrom)) {
+ def = NULL;
+ if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0)
+ return NULL;
+
+ return g_steal_pointer(&incr);
+ }
+
+ if (!n->def->parent_name)
+ break;
+
+ n = virDomainCheckpointFindByName(vm->checkpoints, n->def->parent_name);
+ }
+
+ virReportError(VIR_ERR_OPERATION_INVALID,
+ _("could not locate checkpoint '%s' for incremental backup"),
+ incrFrom);
+ return NULL;
+}
+
+
static int
qemuBackupGetBitmapMergeRange(virStorageSourcePtr from,
const char *bitmapname,
@@ -334,11 +378,11 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm,
struct qemuBackupDiskData *dd,
virJSONValuePtr actions,
bool pull,
- virDomainMomentDefPtr *incremental,
virHashTablePtr blockNamedNodeData,
virQEMUDriverConfigPtr cfg)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
+ g_autofree virDomainMomentDefPtr *incremental = NULL;
/* set data structure */
dd->backupdisk = backupdisk;
@@ -360,7 +404,8 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm,
* pull mode:
* both: original disk
*/
- if (pull || (incremental && dd->store->format >= VIR_STORAGE_FILE_BACKING)) {
+ if (pull || (dd->backupdisk->incremental &&
+ dd->store->format >= VIR_STORAGE_FILE_BACKING)) {
dd->backingStore = dd->domdisk->src;
} else {
dd->backingStore = dd->terminator = virStorageSourceNew();
@@ -372,7 +417,10 @@ qemuBackupDiskPrepareDataOne(virDomainObjPtr vm,
if (qemuDomainPrepareStorageSourceBlockdev(NULL, dd->store, priv, cfg) < 0)
return -1;
- if (incremental) {
+ if (dd->backupdisk->incremental) {
+ if (!(incremental = qemuBackupBeginCollectIncrementalCheckpoints(vm, dd->backupdisk->incremental)))
+ return -1;
+
if (dd->backupdisk->exportbitmap)
dd->incrementalBitmap = g_strdup(dd->backupdisk->exportbitmap);
else
@@ -441,7 +489,6 @@ qemuBackupDiskPrepareDataOnePull(virJSONValuePtr actions,
static ssize_t
qemuBackupDiskPrepareData(virDomainObjPtr vm,
virDomainBackupDefPtr def,
- virDomainMomentDefPtr *incremental,
virHashTablePtr blockNamedNodeData,
virJSONValuePtr actions,
virQEMUDriverConfigPtr cfg,
@@ -464,8 +511,7 @@ qemuBackupDiskPrepareData(virDomainObjPtr vm,
ndisks++;
if (qemuBackupDiskPrepareDataOne(vm, backupdisk, dd, actions, pull,
- incremental, blockNamedNodeData,
- cfg) < 0)
+ blockNamedNodeData, cfg) < 0)
goto error;
if (pull) {
@@ -622,50 +668,6 @@ qemuBackupBeginPullExportDisks(virDomainObjPtr vm,
}
-/**
- * qemuBackupBeginCollectIncrementalCheckpoints:
- * @vm: domain object
- * @incrFrom: name of checkpoint representing starting point of incremental backup
- *
- * Returns a NULL terminated list of pointers to checkpoint definitions in
- * chronological order starting from the 'current' checkpoint until reaching
- * @incrFrom.
- */
-static virDomainMomentDefPtr *
-qemuBackupBeginCollectIncrementalCheckpoints(virDomainObjPtr vm,
- const char *incrFrom)
-{
- virDomainMomentObjPtr n = virDomainCheckpointGetCurrent(vm->checkpoints);
- g_autofree virDomainMomentDefPtr *incr = NULL;
- size_t nincr = 0;
-
- while (n) {
- virDomainMomentDefPtr def = n->def;
-
- if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0)
- return NULL;
-
- if (STREQ(def->name, incrFrom)) {
- def = NULL;
- if (VIR_APPEND_ELEMENT_COPY(incr, nincr, def) < 0)
- return NULL;
-
- return g_steal_pointer(&incr);
- }
-
- if (!n->def->parent_name)
- break;
-
- n = virDomainCheckpointFindByName(vm->checkpoints, n->def->parent_name);
- }
-
- virReportError(VIR_ERR_OPERATION_INVALID,
- _("could not locate checkpoint '%s' for incremental backup"),
- incrFrom);
- return NULL;
-}
-
-
void
qemuBackupJobTerminate(virDomainObjPtr vm,
qemuDomainJobStatus jobstatus)
@@ -799,7 +801,6 @@ qemuBackupBegin(virDomainObjPtr vm,
bool pull = false;
virDomainMomentObjPtr chk = NULL;
g_autoptr(virDomainCheckpointDef) chkdef = NULL;
- g_autofree virDomainMomentDefPtr *incremental = NULL;
g_autoptr(virJSONValue) actions = NULL;
struct qemuBackupDiskData *dd = NULL;
ssize_t ndd = 0;
@@ -867,10 +868,6 @@ qemuBackupBegin(virDomainObjPtr vm,
if (virDomainBackupAlignDisks(def, vm->def, suffix) < 0)
goto endjob;
- if (def->incremental &&
- !(incremental = qemuBackupBeginCollectIncrementalCheckpoints(vm, def->incremental)))
- goto endjob;
-
actions = virJSONValueNewArray();
/* The 'chk' checkpoint must be rolled back if the transaction command
@@ -884,7 +881,7 @@ qemuBackupBegin(virDomainObjPtr vm,
if (!(blockNamedNodeData = qemuBlockGetNamedNodeData(vm, QEMU_ASYNC_JOB_BACKUP)))
goto endjob;
- if ((ndd = qemuBackupDiskPrepareData(vm, def, incremental, blockNamedNodeData,
+ if ((ndd = qemuBackupDiskPrepareData(vm, def, blockNamedNodeData,
actions, cfg, &dd)) <= 0) {
if (ndd == 0) {
virReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
--
2.27.0