From 28c7179c49ed6b21301c9bbf9adb896422816e7c Mon Sep 17 00:00:00 2001 Message-Id: <28c7179c49ed6b21301c9bbf9adb896422816e7c.1382534061.git.jdenemar@redhat.com> From: Peter Krempa Date: Mon, 14 Oct 2013 16:38:48 +0200 Subject: [PATCH] qemu: snapshot: Add support for compressing external snapshot memory 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 (cherry picked from commit 7df5093f67f0560d0440807b4363746e032ad942) Signed-off-by: Jiri Denemark --- 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 5344125..3a874ca 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -56,6 +56,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 a2735cb..be6ab2a 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -269,8 +269,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 86ed9ed..c9d90db 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -502,6 +502,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 8229cfc..dc5f8db 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -143,6 +143,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 14b0d57..3d0b56e 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12391,6 +12391,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; @@ -12452,12 +12454,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; @@ -12546,6 +12564,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 d4e4fae..d5df46c 100644 --- a/src/qemu/test_libvirtd_qemu.aug.in +++ b/src/qemu/test_libvirtd_qemu.aug.in @@ -48,6 +48,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.4