[libvirt] [PATCHv3] qemu: snapshot: Add support for compressing external snapshot memory

Peter Krempa pkrempa at redhat.com
Mon Oct 14 13:56:21 UTC 2013


The regular save image code has the support to compress images using a
specified algorithm. This was not implemented for external checkpoints
although it shares most of the backend code.

Resolves: https://bugzilla.redhat.com/show_bug.cgi?id=1017227
---

Notes:
    Version 3:
    - added changes for augeas (and installed augeas to avoid such problems)

 src/qemu/libvirtd_qemu.aug         |  1 +
 src/qemu/qemu.conf                 |  6 ++++++
 src/qemu/qemu_conf.c               |  2 ++
 src/qemu/qemu_conf.h               |  1 +
 src/qemu/qemu_driver.c             | 23 +++++++++++++++++++++--
 src/qemu/test_libvirtd_qemu.aug.in |  1 +
 6 files changed, 32 insertions(+), 2 deletions(-)

diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug
index 591d78d..32db983 100644
--- a/src/qemu/libvirtd_qemu.aug
+++ b/src/qemu/libvirtd_qemu.aug
@@ -58,6 +58,7 @@ module Libvirtd_qemu =

    let save_entry =  str_entry "save_image_format"
                  | str_entry "dump_image_format"
+                 | str_entry "snapshot_image_format"
                  | str_entry "auto_dump_path"
                  | bool_entry "auto_dump_bypass_cache"
                  | bool_entry "auto_start_bypass_cache"
diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
index 3032aa6..bf57b9c 100644
--- a/src/qemu/qemu.conf
+++ b/src/qemu/qemu.conf
@@ -278,8 +278,14 @@
 # the requested compression program can't be found, this falls
 # back to "raw" compression.
 #
+# snapshot_image_format specifies the compression algorithm of the memory save
+# image when an external snapshot of a domain is taken. This does not apply
+# on disk image format. It is an error if the specified format isn't valid,
+# or the requested compression program can't be found.
+#
 #save_image_format = "raw"
 #dump_image_format = "raw"
+#snapshot_image_format = "raw"

 # When a domain is configured to be auto-dumped when libvirtd receives a
 # watchdog event from qemu guest, libvirtd will save dump files in directory
diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c
index 16a0b92..295f1eb 100644
--- a/src/qemu/qemu_conf.c
+++ b/src/qemu/qemu_conf.c
@@ -521,6 +521,8 @@ int virQEMUDriverConfigLoadFile(virQEMUDriverConfigPtr cfg,

     GET_VALUE_STR("save_image_format", cfg->saveImageFormat);
     GET_VALUE_STR("dump_image_format", cfg->dumpImageFormat);
+    GET_VALUE_STR("snapshot_image_format", cfg->snapshotImageFormat);
+
     GET_VALUE_STR("auto_dump_path", cfg->autoDumpPath);
     GET_VALUE_BOOL("auto_dump_bypass_cache", cfg->autoDumpBypassCache);
     GET_VALUE_BOOL("auto_start_bypass_cache", cfg->autoStartBypassCache);
diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h
index 40adfce..ea3c691 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -144,6 +144,7 @@ struct _virQEMUDriverConfig {

     char *saveImageFormat;
     char *dumpImageFormat;
+    char *snapshotImageFormat;

     char *autoDumpPath;
     bool autoDumpBypassCache;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 80285ff..69086c2 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12128,6 +12128,8 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
     bool transaction = virQEMUCapsGet(priv->qemuCaps, QEMU_CAPS_TRANSACTION);
     int thaw = 0; /* 1 if freeze succeeded, -1 if freeze failed */
     bool pmsuspended = false;
+    virQEMUDriverConfigPtr cfg = NULL;
+    int compressed = QEMU_SAVE_FORMAT_RAW;

     if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_SNAPSHOT) < 0)
         goto cleanup;
@@ -12189,12 +12191,28 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
                                      JOB_MASK(QEMU_JOB_SUSPEND) |
                                      JOB_MASK(QEMU_JOB_MIGRATION_OP));

+        cfg = virQEMUDriverGetConfig(driver);
+        if (cfg->snapshotImageFormat) {
+            compressed = qemuSaveCompressionTypeFromString(cfg->snapshotImageFormat);
+            if (compressed < 0) {
+                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                               _("Invalid snapshot image format specified "
+                                 "in configuration file"));
+                goto cleanup;
+            }
+            if (!qemuCompressProgramAvailable(compressed)) {
+                virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                               _("Compression program for image format "
+                                 "in configuration file isn't available"));
+                goto cleanup;
+            }
+        }
+
         if (!(xml = qemuDomainDefFormatLive(driver, vm->def, true, true)))
             goto endjob;

         if ((ret = qemuDomainSaveMemory(driver, vm, snap->def->file,
-                                        xml, QEMU_SAVE_FORMAT_RAW,
-                                        resume, 0,
+                                        xml, compressed, resume, 0,
                                         QEMU_ASYNC_JOB_SNAPSHOT)) < 0)
             goto endjob;

@@ -12283,6 +12301,7 @@ endjob:

 cleanup:
     VIR_FREE(xml);
+    virObjectUnref(cfg);
     if (memory_unlink && ret < 0)
         unlink(snap->def->file);

diff --git a/src/qemu/test_libvirtd_qemu.aug.in b/src/qemu/test_libvirtd_qemu.aug.in
index 4b27db1..7af3f64 100644
--- a/src/qemu/test_libvirtd_qemu.aug.in
+++ b/src/qemu/test_libvirtd_qemu.aug.in
@@ -49,6 +49,7 @@ module Test_libvirtd_qemu =
 }
 { "save_image_format" = "raw" }
 { "dump_image_format" = "raw" }
+{ "snapshot_image_format" = "raw" }
 { "auto_dump_path" = "/var/lib/libvirt/qemu/dump" }
 { "auto_dump_bypass_cache" = "0" }
 { "auto_start_bypass_cache" = "0" }
-- 
1.8.3.2




More information about the libvir-list mailing list