]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: rename: support renaming checkpoints directory
authorNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Tue, 3 Nov 2020 06:51:19 +0000 (09:51 +0300)
committerNikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Fri, 13 Nov 2020 11:49:50 +0000 (14:49 +0300)
This is basically just saves checkpoints metadata on disk after name is changed
in memory as path to domain checkpoints directory depends on name. After that
old checkpoint directory is deleted with checkpoint metadata files.

Signed-off-by: Nikolay Shirokovskiy <nshirokovskiy@virtuozzo.com>
Reviewed-by: Daniel Henrique Barboza <danielhb413@gmail.com>
src/qemu/qemu_checkpoint.c
src/qemu/qemu_checkpoint.h
src/qemu/qemu_domain.c
src/qemu/qemu_driver.c

index eb33633a11b17bfc2d1bab7b31f0f147d4925641..8dce7d875671bfaff0bb1a715fe2f04fd997a0f2 100644 (file)
@@ -76,7 +76,7 @@ qemuCheckpointObjFromCheckpoint(virDomainObjPtr vm,
 }
 
 
-static int
+int
 qemuCheckpointWriteMetadata(virDomainObjPtr vm,
                             virDomainMomentObjPtr checkpoint,
                             virDomainXMLOptionPtr xmlopt,
index 4bb09bff05f33f6b5628b3dee49869ccbcd7e55f..26264aee03db79e096cbb090ffb356d1e925bf46 100644 (file)
@@ -79,3 +79,9 @@ qemuCheckpointDiscardDiskBitmaps(virStorageSourcePtr src,
                                  virJSONValuePtr actions,
                                  const char *diskdst,
                                  GSList **reopenimages);
+
+int
+qemuCheckpointWriteMetadata(virDomainObjPtr vm,
+                            virDomainMomentObjPtr checkpoint,
+                            virDomainXMLOptionPtr xmlopt,
+                            const char *checkpointDir);
index e287e31e3681385541d6dd63421f0a558ca7c1b4..8468bf6da4a39e6bace1e26801938dae12c03d83 100644 (file)
@@ -11103,10 +11103,12 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg,
     g_autofree char *cfg_file = NULL;
     g_autofree char *autostart_link = NULL;
     g_autofree char *snap_dir = NULL;
+    g_autofree char *chk_dir = NULL;
 
     cfg_file = virDomainConfigFile(cfg->configDir, name);
     autostart_link = virDomainConfigFile(cfg->autostartDir, name);
     snap_dir = g_strdup_printf("%s/%s", cfg->snapshotDir, name);
+    chk_dir = g_strdup_printf("%s/%s", cfg->checkpointDir, name);
 
     if (virFileExists(cfg_file) &&
         unlink(cfg_file) < 0) {
@@ -11127,5 +11129,10 @@ qemuDomainNamePathsCleanup(virQEMUDriverConfigPtr cfg,
         !bestEffort)
         return -1;
 
+    if (virFileIsDir(chk_dir) &&
+        virFileDeleteTree(chk_dir) < 0 &&
+        !bestEffort)
+        return -1;
+
     return 0;
 }
index cb86f52364460c25300320f6d18c4d49cc3aa819..b0bcafa13ce55d3ce01de8fb409f6dba69e1b577 100644 (file)
@@ -19120,6 +19120,24 @@ qemuDomainSnapshotWriteMetadataIter(void *payload,
 }
 
 
+static int
+qemuDomainCheckpointWriteMetadataIter(void *payload,
+                                      const char *name G_GNUC_UNUSED,
+                                      void *opaque)
+{
+    struct qemuDomainMomentWriteMetadataData *data = opaque;
+    virQEMUDriverConfigPtr cfg =  virQEMUDriverGetConfig(data->driver);
+    int ret;
+
+    ret = qemuCheckpointWriteMetadata(data->vm, payload,
+                                      data->driver->xmlopt,
+                                      cfg->snapshotDir);
+
+    virObjectUnref(cfg);
+    return ret;
+}
+
+
 static int
 qemuDomainRenameCallback(virDomainObjPtr vm,
                          const char *new_name,
@@ -19186,6 +19204,11 @@ qemuDomainRenameCallback(virDomainObjPtr vm,
                                  &data) < 0)
         goto cleanup;
 
+    if (virDomainCheckpointForEach(vm->checkpoints,
+                                   qemuDomainCheckpointWriteMetadataIter,
+                                   &data) < 0)
+        goto cleanup;
+
     if (virDomainDefSave(vm->def, driver->xmlopt, cfg->configDir) < 0)
         goto cleanup;