[libvirt] [PATCH 3/4] qemu: managedsave: Add support for compressing managed save images

Peter Krempa pkrempa at redhat.com
Wed Oct 9 16:31:31 UTC 2013


The regular save image code has the support to compress images using a
specified algorithm. This was not implemented for managed save although
it shares most of the backend code.
---
 src/qemu/qemu.conf     |  6 ++++++
 src/qemu/qemu_conf.c   |  2 ++
 src/qemu/qemu_conf.h   |  1 +
 src/qemu/qemu_driver.c | 23 +++++++++++++++++++++--
 4 files changed, 30 insertions(+), 2 deletions(-)

diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf
index 5fd6263..7cf67df 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.
 #
+# managedsave_image_format is used when a domain is saved to a location managed
+# by libvirt for example by using 'virsh managedsave'.  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"
+#managedsave_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 1a41caf..3e3cc28 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("managedsave_image_format", cfg->managedsaveImageFormat);
+
     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 da29a2a..3a68c4a 100644
--- a/src/qemu/qemu_conf.h
+++ b/src/qemu/qemu_conf.h
@@ -144,6 +144,7 @@ struct _virQEMUDriverConfig {

     char *saveImageFormat;
     char *dumpImageFormat;
+    char *managedsaveImageFormat;

     char *autoDumpPath;
     bool autoDumpBypassCache;
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index cfdbb9a..bd69e5f 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3232,6 +3232,8 @@ static int
 qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
 {
     virQEMUDriverPtr driver = dom->conn->privateData;
+    virQEMUDriverConfigPtr cfg = NULL;
+    int compressed = QEMU_SAVE_FORMAT_RAW;
     virDomainObjPtr vm;
     char *name = NULL;
     int ret = -1;
@@ -3257,13 +3259,29 @@ qemuDomainManagedSave(virDomainPtr dom, unsigned int flags)
         goto cleanup;
     }

+    cfg = virQEMUDriverGetConfig(driver);
+    if (cfg->managedsaveImageFormat) {
+        compressed = qemuSaveCompressionTypeFromString(cfg->managedsaveImageFormat);
+        if (compressed < 0) {
+            virReportError(VIR_ERR_OPERATION_FAILED, "%s",
+                           _("Invalid managedsave 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 (!(name = qemuDomainManagedSavePath(driver, vm)))
         goto cleanup;

     VIR_INFO("Saving state of domain '%s' to '%s'", vm->def->name, name);

-    if ((ret = qemuDomainSaveInternal(driver, dom, vm, name,
-                                      QEMU_SAVE_FORMAT_RAW,
+    if ((ret = qemuDomainSaveInternal(driver, dom, vm, name, compressed,
                                       NULL, flags)) == 0)
         vm->hasManagedSave = true;

@@ -3273,6 +3291,7 @@ cleanup:
     if (vm)
         virObjectUnlock(vm);
     VIR_FREE(name);
+    virObjectUnref(cfg);

     return ret;
 }
-- 
1.8.3.2




More information about the libvir-list mailing list