[libvirt] [PATCHv2 0/2] Enable compression of external snapshots and managed save images

Version 2 treats save images and managed save images as same, using the same config option. Peter Krempa (2): qemu: managedsave: Add support for compressing managed save images qemu: snapshot: Add support for compressing external snapshot memory src/qemu/qemu.conf | 12 +++++++++--- src/qemu/qemu_conf.c | 2 ++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 46 ++++++++++++++++++++++++++++++++++++++++++---- 4 files changed, 54 insertions(+), 7 deletions(-) -- 1.8.3.2

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_driver.c | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf index 5fd6263..cf82ffe 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -269,9 +269,9 @@ # saving a domain in order to save disk space; the list above is in descending # order by performance and ascending order by compression ratio. # -# save_image_format is used when you use 'virsh save' at scheduled -# saving, and it is an error if the specified save_image_format is -# not valid, or the requested compression program can't be found. +# save_image_format is used when you use 'virsh save' or 'virsh managedsave' +# at scheduled saving, and it is an error if the specified save_image_format +# is not valid, or the requested compression program can't be found. # # dump_image_format is used when you use 'virsh dump' at emergency # crashdump, and if the specified dump_image_format is not valid, or diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index cfdbb9a..6f15240 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->saveImageFormat) { + compressed = qemuSaveCompressionTypeFromString(cfg->saveImageFormat); + if (compressed < 0) { + virReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("Invalid save 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

On Thu, Oct 10, 2013 at 02:52:36PM +0200, Peter Krempa wrote:
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_driver.c | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-)
ACK Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 10/14/13 15:28, Daniel P. Berrange wrote:
On Thu, Oct 10, 2013 at 02:52:36PM +0200, Peter Krempa wrote:
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_driver.c | 23 +++++++++++++++++++++-- 2 files changed, 24 insertions(+), 5 deletions(-)
ACK
Pushed; Thanks. Peter

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 --- 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 cf82ffe..7ca1761 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 1a41caf..d6e8519 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 da29a2a..09dca51 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 6f15240..a1c4ed9 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -12116,6 +12116,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; @@ -12177,12 +12179,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; @@ -12271,6 +12289,7 @@ endjob: cleanup: VIR_FREE(xml); + virObjectUnref(cfg); if (memory_unlink && ret < 0) unlink(snap->def->file); -- 1.8.3.2

On Thu, Oct 10, 2013 at 02:52:37PM +0200, Peter Krempa wrote:
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 --- src/qemu/qemu.conf | 6 ++++++
Missing change to qemu.aug and test_qemu.aug
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(-)
Daniel -- |: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :| |: http://libvirt.org -o- http://virt-manager.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|

On 10/10/13 14:52, Peter Krempa wrote:
Version 2 treats save images and managed save images as same, using the same config option.
Peter Krempa (2): qemu: managedsave: Add support for compressing managed save images qemu: snapshot: Add support for compressing external snapshot memory
Ping? Could somebody please have a look? Thanks. Peter
participants (2)
-
Daniel P. Berrange
-
Peter Krempa