On Mon, Mar 03, 2014 at 10:27:24AM +0800, qiaonuohan wrote:
--memory-only option is introduced without compression supported.
Therefore,
this is a freature regression of virsh dump. Now qemu has support dumping memory
in kdump-compressed format. This patch is adding new virDomainCoreDumpWithFormat
API, so that the format in which qemu dump domain's memory can be specified.
Signed-off-by: Qiao Nuohan <qiaonuohan(a)cn.fujitsu.com>
---
include/libvirt/libvirt.h.in | 31 ++++++++++++++
src/driver.h | 7 +++
src/libvirt.c | 100 +++++++++++++++++++++++++++++++++++++++++++
src/libvirt_public.syms | 5 +++
src/remote/remote_driver.c | 1 +
src/remote/remote_protocol.x | 15 ++++++-
src/remote_protocol-structs | 7 +++
src/test/test_driver.c | 19 ++++++--
8 files changed, 181 insertions(+), 4 deletions(-)
diff --git a/include/libvirt/libvirt.h.in b/include/libvirt/libvirt.h.in
index 295d551..12d64ab 100644
--- a/include/libvirt/libvirt.h.in
+++ b/include/libvirt/libvirt.h.in
diff --git a/src/libvirt.c b/src/libvirt.c
index dcf6b53..5a6a576 100644
--- a/src/libvirt.c
+++ b/src/libvirt.c
@@ -2999,6 +2999,106 @@ error:
return -1;
}
+/**
+ * virDomainCoreDumpWithFormat:
+ * @domain: a domain object
+ * @to: path for the core file
+ * @dumpformat: format of domain memory's dump
+ * @flags: bitwise-OR of virDomainCoreDumpFlags
+ *
+ * This method will dump the core of a domain on a given file for analysis.
+ * Note that for remote Xen Daemon the file path will be interpreted in
+ * the remote host. Hypervisors may require the user to manually ensure
+ * proper permissions on the file named by @to.
+ *
+ * If @flags includes VIR_DUMP_MEMORY_ONLY and dumpformat is set, libvirt
+ * will ask qemu dump domain's memory in kdump-compressed format.
+ *
+ * If @flags includes VIR_DUMP_CRASH, then leave the guest shut off with
+ * a crashed state after the dump completes. If @flags includes
+ * VIR_DUMP_LIVE, then make the core dump while continuing to allow
+ * the guest to run; otherwise, the guest is suspended during the dump.
+ * VIR_DUMP_RESET flag forces reset of the quest after dump.
+ * The above three flags are mutually exclusive.
+ *
+ * Additionally, if @flags includes VIR_DUMP_BYPASS_CACHE, then libvirt
+ * will attempt to bypass the file system cache while creating the file,
+ * or fail if it cannot do so for the given system; this can allow less
+ * pressure on file system cache, but also risks slowing saves to NFS.
+ *
+ * Returns 0 in case of success and -1 in case of failure.
+ */
+int
+virDomainCoreDumpWithFormat(virDomainPtr domain, const char *to, unsigned int
+ dumpformat, unsigned int flags)
+{
+ virConnectPtr conn;
+
+ VIR_DOMAIN_DEBUG(domain, "to=%s, flags=%x", to, flags);
+
+ virResetLastError();
+
+ virCheckDomainReturn(domain, -1);
+ conn = domain->conn;
+
+ virCheckReadOnlyGoto(conn->flags, error);
+ virCheckNonNullArgGoto(to, error);
+
+ if (!(flags & VIR_DUMP_MEMORY_ONLY) &&
+ (dumpformat == VIR_DUMP_FORMAT_KDUMP_ZLIB ||
+ dumpformat == VIR_DUMP_FORMAT_KDUMP_LZO ||
+ dumpformat == VIR_DUMP_FORMAT_KDUMP_SNAPPY)) {
+ virReportInvalidArg(flags, "%s",
+ _("compression format is only work with
memory-only"));
+ goto error;
+ }
This should be something checked on the QEMU driver since it is an
implmentation restriction, not an API restriction.
This should validate that dumpformat < VIR_DUMP_FORMAT_LAST though
+
+ if ((flags & VIR_DUMP_CRASH) && (flags & VIR_DUMP_LIVE)) {
+ virReportInvalidArg(flags, "%s",
+ _("crash and live flags are mutually
exclusive"));
+ goto error;
+ }
+
+ if ((flags & VIR_DUMP_CRASH) && (flags & VIR_DUMP_RESET)) {
+ virReportInvalidArg(flags, "%s",
+ _("crash and reset flags are mutually exclusive"));
+ goto error;
+ }
+
+ if ((flags & VIR_DUMP_LIVE) && (flags & VIR_DUMP_RESET)) {
+ virReportInvalidArg(flags, "%s",
+ _("live and reset flags are mutually
exclusive"));
+ goto error;
+ }
+
+ if (conn->driver->domainCoreDumpWithFormat) {
+ int ret;
+ char *absolute_to;
+
+ /* We must absolutize the file path as the save is done out of process */
+ if (virFileAbsPath(to, &absolute_to) < 0) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("could not build absolute core file path"));
+ goto error;
+ }
+
+ ret = conn->driver->domainCoreDumpWithFormat(domain, absolute_to,
+ dumpformat, flags);
+
+ VIR_FREE(absolute_to);
+
+ if (ret < 0)
+ goto error;
+ return ret;
+ }
+
+ virReportUnsupportedError();
+
+error:
+ virDispatchError(domain->conn);
+ return -1;
+}
diff --git a/src/test/test_driver.c b/src/test/test_driver.c
index b724f82..605b0d1 100644
--- a/src/test/test_driver.c
+++ b/src/test/test_driver.c
@@ -2427,9 +2427,10 @@ testDomainRestore(virConnectPtr conn,
return testDomainRestoreFlags(conn, path, NULL, 0);
}
-static int testDomainCoreDump(virDomainPtr domain,
- const char *to,
- unsigned int flags)
+static int testDomainCoreDumpWithFormat(virDomainPtr domain,
+ const char *to,
+ unsigned int dumpformat,
+ unsigned int flags)
{
testConnPtr privconn = domain->conn->privateData;
int fd = -1;
@@ -2479,6 +2480,12 @@ static int testDomainCoreDump(virDomainPtr domain,
}
}
+ if (dumpformat > VIR_DUMP_FORMAT_KDUMP_SNAPPY) {
+ virReportSystemError(errno,
+ _("invalid value of dumpformat: %d"),
dumpformat);
+ goto cleanup;
+ }
This should be done in the libvirt.c entry point, comparing against
VIR_DUMP_FORMAT_LAST
Regards,
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 :|