[libvirt] [PATCH 1/2] support compression at virsh dump

From 4f74c4a69785432258ad5ea5e695d1b94aaa5b30 Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Date: Thu, 28 Oct 2010 16:31:46 +0900 Subject: [PATCH 1/2] add compression support for "virsh dump"
Add dump_image_format[] to qemu.conf and support compressed dump at virsh dump. coredump compression is important for saving disk space in an environment where multiple guests run. In general, "disk space for dump" is specially allocated and will be a dead space in the system. It's used only at emergency. So, it's better to have both of save_image_format and dump_image_format. "save" is done in scheduled manner with enough calculated disk space for it. This code reuses some of save_image_format[] and supports the same format. Changelog: - modified libvirtd_qemu.aug - modified test_libvirtd_qemu.aug - fixed error handling of qemudSaveCompressionTypeFromString() --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf | 4 +++ src/qemu/qemu_conf.c | 11 ++++++++++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 41 ++++++++++++++++++++++++++++++++------ src/qemu/test_libvirtd_qemu.aug | 2 + 6 files changed, 53 insertions(+), 7 deletions(-) diff --git a/src/qemu/libvirtd_qemu.aug b/src/qemu/libvirtd_qemu.aug index b9ace3e..66994fd 100644 --- a/src/qemu/libvirtd_qemu.aug +++ b/src/qemu/libvirtd_qemu.aug @@ -36,6 +36,7 @@ module Libvirtd_qemu = | str_array_entry "cgroup_controllers" | str_array_entry "cgroup_device_acl" | str_entry "save_image_format" + | str_entry "dump_image_format" | str_entry "hugetlbfs_mount" | bool_entry "relaxed_acs_check" | bool_entry "vnc_allow_host_audio" diff --git a/src/qemu/qemu.conf b/src/qemu/qemu.conf index 53b76e7..e2c581e 100644 --- a/src/qemu/qemu.conf +++ b/src/qemu/qemu.conf @@ -145,7 +145,11 @@ # 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. +# dump_image_format is used when you use 'virsh dump' at emergency crashdump. +# # save_image_format = "raw" +# dump_image_format = "raw" # If provided by the host and a hugetlbfs mount point is configured, diff --git a/src/qemu/qemu_conf.c b/src/qemu/qemu_conf.c index 5bd3d4c..b5c17b5 100644 --- a/src/qemu/qemu_conf.c +++ b/src/qemu/qemu_conf.c @@ -325,6 +325,17 @@ int qemudLoadDriverConfig(struct qemud_driver *driver, } } + p = virConfGetValue (conf, "dump_image_format"); + CHECK_TYPE ("dump_image_format", VIR_CONF_STRING); + if (p && p->str) { + VIR_FREE(driver->dumpImageFormat); + if (!(driver->dumpImageFormat = strdup(p->str))) { + virReportOOMError(); + virConfFree(conf); + return -1; + } + } + p = virConfGetValue (conf, "hugetlbfs_mount"); CHECK_TYPE ("hugetlbfs_mount", VIR_CONF_STRING); if (p && p->str) { diff --git a/src/qemu/qemu_conf.h b/src/qemu/qemu_conf.h index 530dcdb..bbe6887 100644 --- a/src/qemu/qemu_conf.h +++ b/src/qemu/qemu_conf.h @@ -164,6 +164,7 @@ struct qemud_driver { virSecurityDriverPtr securitySecondaryDriver; char *saveImageFormat; + char *dumpImageFormat; pciDeviceList *activePciHostdevs; diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index b119ca1..51ad50b 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5907,11 +5907,22 @@ static int qemudDomainCoreDump(virDomainPtr dom, int resume = 0, paused = 0; int ret = -1, fd = -1; virDomainEventPtr event = NULL; - const char *args[] = { - "cat", - NULL, - }; + int compress; qemuDomainObjPrivatePtr priv; + /* + * We reuse "save" flag for "dump" here. Then, we can support the same + * format in "save" and "dump". + */ + compress = QEMUD_SAVE_FORMAT_RAW; + if (driver->dumpImageFormat) { + compress = qemudSaveCompressionTypeFromString(driver->dumpImageFormat); + if (compress < 0) { + qemuReportError(VIR_ERR_OPERATION_FAILED, "%s", + _("Invalid dump image format specified in " + "configuration file")); + return -1; + } + } qemuDriverLock(driver); vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -5978,9 +5989,25 @@ static int qemudDomainCoreDump(virDomainPtr dom, } qemuDomainObjEnterMonitorWithDriver(driver, vm); - ret = qemuMonitorMigrateToFile(priv->mon, - QEMU_MONITOR_MIGRATE_BACKGROUND, - args, path, 0); + if (compress == QEMUD_SAVE_FORMAT_RAW) { + const char *args[] = { + "cat", + NULL, + }; + ret = qemuMonitorMigrateToFile(priv->mon, + QEMU_MONITOR_MIGRATE_BACKGROUND, + args, path, 0); + } else { + const char *prog = qemudSaveCompressionTypeToString(compress); + const char *args[] = { + prog, + "-c", + NULL, + }; + ret = qemuMonitorMigrateToFile(priv->mon, + QEMU_MONITOR_MIGRATE_BACKGROUND, + args, path, 0); + } qemuDomainObjExitMonitorWithDriver(driver, vm); if (ret < 0) goto endjob; diff --git a/src/qemu/test_libvirtd_qemu.aug b/src/qemu/test_libvirtd_qemu.aug index 6788346..efbf642 100644 --- a/src/qemu/test_libvirtd_qemu.aug +++ b/src/qemu/test_libvirtd_qemu.aug @@ -94,6 +94,8 @@ cgroup_device_acl = [ \"/dev/null\", \"/dev/full\", \"/dev/zero\" ] save_image_format = \"gzip\" +dump_image_format = \"gzip\" + hugetlbfs_mount = \"/dev/hugepages\" set_process_name = 1 -- 1.7.2.3

From bc55de1e6a8506adcde52aa95e2be9d4bb5bfb2e Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Date: Thu, 28 Oct 2010 17:51:18 +0900 Subject: [PATCH 2/2] check compression program availabilityy of virsh save and dump.
--- src/qemu/qemu_driver.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 51ad50b..61dc6e8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5740,6 +5740,22 @@ cleanup: return ret; } +/* returns 1 if a compression program is available in PATH */ +static int qemudCompressProgramAvailable(int compress) +{ + const char *prog; + char *c; + + if (compress == QEMUD_SAVE_FORMAT_RAW) + return 1; + prog = qemudSaveCompressionTypeToString(compress); + c = virFindFileInPath(prog); + if (!c) + return 0; + VIR_FREE(c); + return 1; +} + static int qemudDomainSave(virDomainPtr dom, const char *path) { struct qemud_driver *driver = dom->conn->privateData; @@ -5759,6 +5775,12 @@ static int qemudDomainSave(virDomainPtr dom, const char *path) "in configuration file")); return -1; } + if (!qemudCompressProgramAvailable(compressed)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Compression program for image format " + "in configuration file isn't available")); + return -1; + } } vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -5922,6 +5944,12 @@ static int qemudDomainCoreDump(virDomainPtr dom, "configuration file")); return -1; } + if (!qemudCompressProgramAvailable(compress)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Compression program for dump image format " + "in configuration file isn't available")); + return -1; + } } qemuDriverLock(driver); -- 1.7.2.3

On Thu, Oct 28, 2010 at 07:28:34PM +0900, KAMEZAWA Hiroyuki wrote:
From bc55de1e6a8506adcde52aa95e2be9d4bb5bfb2e Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Date: Thu, 28 Oct 2010 17:51:18 +0900 Subject: [PATCH 2/2] check compression program availabilityy of virsh save and dump.
--- src/qemu/qemu_driver.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 51ad50b..61dc6e8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5740,6 +5740,22 @@ cleanup: return ret; }
+/* returns 1 if a compression program is available in PATH */ +static int qemudCompressProgramAvailable(int compress) +{ + const char *prog; + char *c; + + if (compress == QEMUD_SAVE_FORMAT_RAW) + return 1; + prog = qemudSaveCompressionTypeToString(compress); + c = virFindFileInPath(prog); + if (!c) + return 0; + VIR_FREE(c); + return 1; +} + static int qemudDomainSave(virDomainPtr dom, const char *path) { struct qemud_driver *driver = dom->conn->privateData; @@ -5759,6 +5775,12 @@ static int qemudDomainSave(virDomainPtr dom, const char *path) "in configuration file")); return -1; } + if (!qemudCompressProgramAvailable(compressed)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Compression program for image format " + "in configuration file isn't available")); + return -1; + } }
vm = virDomainFindByUUID(&driver->domains, dom->uuid); @@ -5922,6 +5944,12 @@ static int qemudDomainCoreDump(virDomainPtr dom, "configuration file")); return -1; } + if (!qemudCompressProgramAvailable(compress)) { + qemuReportError(VIR_ERR_OPERATION_FAILED, + "%s", _("Compression program for dump image format " + "in configuration file isn't available")); + return -1; + } }
qemuDriverLock(driver);
ACK Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On 10/29/2010 04:37 AM, Daniel P. Berrange wrote:
On Thu, Oct 28, 2010 at 07:28:34PM +0900, KAMEZAWA Hiroyuki wrote:
From bc55de1e6a8506adcde52aa95e2be9d4bb5bfb2e Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Date: Thu, 28 Oct 2010 17:51:18 +0900 Subject: [PATCH 2/2] check compression program availabilityy of virsh save and dump.
I fixed that typo (s/yy/y/)...
--- src/qemu/qemu_driver.c | 28 ++++++++++++++++++++++++++++ 1 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 51ad50b..61dc6e8 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -5740,6 +5740,22 @@ cleanup: return ret; }
+/* returns 1 if a compression program is available in PATH */ +static int qemudCompressProgramAvailable(int compress)
changed this to use enum qemud_save_formats and return bool in the signature...
ACK
and pushed. Here's the incremental diff: diff --git i/src/qemu/qemu_driver.c w/src/qemu/qemu_driver.c index 9a5f5b9..a7cce6a 100644 --- i/src/qemu/qemu_driver.c +++ w/src/qemu/qemu_driver.c @@ -5742,20 +5742,20 @@ cleanup: return ret; } -/* returns 1 if a compression program is available in PATH */ -static int qemudCompressProgramAvailable(int compress) +/* Returns true if a compression program is available in PATH */ +static bool qemudCompressProgramAvailable(enum qemud_save_formats compress) { const char *prog; char *c; if (compress == QEMUD_SAVE_FORMAT_RAW) - return 1; + return true; prog = qemudSaveCompressionTypeToString(compress); c = virFindFileInPath(prog); if (!c) - return 0; + return false; VIR_FREE(c); - return 1; + return true; } static int qemudDomainSave(virDomainPtr dom, const char *path) -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org

On Thu, Oct 28, 2010 at 07:26:41PM +0900, KAMEZAWA Hiroyuki wrote:
From 4f74c4a69785432258ad5ea5e695d1b94aaa5b30 Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Date: Thu, 28 Oct 2010 16:31:46 +0900 Subject: [PATCH 1/2] add compression support for "virsh dump"
Add dump_image_format[] to qemu.conf and support compressed dump at virsh dump. coredump compression is important for saving disk space in an environment where multiple guests run.
In general, "disk space for dump" is specially allocated and will be a dead space in the system. It's used only at emergency. So, it's better to have both of save_image_format and dump_image_format. "save" is done in scheduled manner with enough calculated disk space for it.
This code reuses some of save_image_format[] and supports the same format.
Changelog: - modified libvirtd_qemu.aug - modified test_libvirtd_qemu.aug - fixed error handling of qemudSaveCompressionTypeFromString() --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf | 4 +++ src/qemu/qemu_conf.c | 11 ++++++++++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 41 ++++++++++++++++++++++++++++++++------ src/qemu/test_libvirtd_qemu.aug | 2 + 6 files changed, 53 insertions(+), 7 deletions(-)
ACK, looks good. Daniel -- |: Red Hat, Engineering, London -o- http://people.redhat.com/berrange/ :| |: http://libvirt.org -o- http://virt-manager.org -o- http://deltacloud.org :| |: http://autobuild.org -o- http://search.cpan.org/~danberr/ :| |: GnuPG: 7D3B9505 -o- F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|

On 10/28/2010 04:26 AM, KAMEZAWA Hiroyuki wrote:
From 4f74c4a69785432258ad5ea5e695d1b94aaa5b30 Mon Sep 17 00:00:00 2001 From: KAMEZAWA Hiroyuki <kamezawa.hiroyu@jp.fujitsu.com> Date: Thu, 28 Oct 2010 16:31:46 +0900 Subject: [PATCH 1/2] add compression support for "virsh dump"
Add dump_image_format[] to qemu.conf and support compressed dump at virsh dump. coredump compression is important for saving disk space in an environment where multiple guests run.
In general, "disk space for dump" is specially allocated and will be a dead space in the system. It's used only at emergency. So, it's better to have both of save_image_format and dump_image_format. "save" is done in scheduled manner with enough calculated disk space for it.
This code reuses some of save_image_format[] and supports the same format.
Changelog: - modified libvirtd_qemu.aug - modified test_libvirtd_qemu.aug - fixed error handling of qemudSaveCompressionTypeFromString() --- src/qemu/libvirtd_qemu.aug | 1 + src/qemu/qemu.conf | 4 +++ src/qemu/qemu_conf.c | 11 ++++++++++ src/qemu/qemu_conf.h | 1 + src/qemu/qemu_driver.c | 41 ++++++++++++++++++++++++++++++++------ src/qemu/test_libvirtd_qemu.aug | 2 + 6 files changed, 53 insertions(+), 7 deletions(-)
I got a failure when trying to apply this patch: Syntax error in lens definition Failed to load ./qemu/test_libvirtd_qemu.aug make[3]: *** [augeas-check] Error 1 Here's what I squashed in, then pushed. diff --git i/src/qemu/libvirtd_qemu.aug w/src/qemu/libvirtd_qemu.aug index 66994fd..78852f3 100644 --- i/src/qemu/libvirtd_qemu.aug +++ w/src/qemu/libvirtd_qemu.aug @@ -36,7 +36,7 @@ module Libvirtd_qemu = | str_array_entry "cgroup_controllers" | str_array_entry "cgroup_device_acl" | str_entry "save_image_format" - | str_entry "dump_image_format" + | str_entry "dump_image_format" | str_entry "hugetlbfs_mount" | bool_entry "relaxed_acs_check" | bool_entry "vnc_allow_host_audio" diff --git i/src/qemu/test_libvirtd_qemu.aug w/src/qemu/test_libvirtd_qemu.aug index efbf642..d3ae58d 100644 --- i/src/qemu/test_libvirtd_qemu.aug +++ w/src/qemu/test_libvirtd_qemu.aug @@ -211,6 +211,8 @@ allow_disk_format_probing = 1 { "#empty" } { "save_image_format" = "gzip" } { "#empty" } +{ "dump_image_format" = "gzip" } +{ "#empty" } { "hugetlbfs_mount" = "/dev/hugepages" } { "#empty" } { "set_process_name" = "1" } -- Eric Blake eblake@redhat.com +1-801-349-2682 Libvirt virtualization library http://libvirt.org
participants (3)
-
Daniel P. Berrange
-
Eric Blake
-
KAMEZAWA Hiroyuki