[libvirt] [PATCH v4 1/3] add new virDomainCoreDumpWithFormat API
Daniel P. Berrange
berrange at redhat.com
Tue Mar 4 11:41:38 UTC 2014
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 at 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 :|
More information about the libvir-list
mailing list