[libvirt] [PATCH v3 3/5] qemu: Track domain quiesced status
Jon Bernard
jbernard at tuxion.com
Tue Mar 25 02:26:55 UTC 2014
* Tomoki Sekiyama <tomoki.sekiyama at hds.com> wrote:
> Adds an quiesced flag into qemuDomainObjPrivate that tracks whether guest
> filesystems of the domain is quiesced or not.
>
> It also modify error code from qemuDomainSnapshotFSFreeze and
> qemuDomainSnapshotFSThaw, so that a caller can know whether the command is
> actually sent to the guest agent. If the error is caused before sending a
> freeze command, a counterpart thaw command shouldn't be sent either, not to
> thaw the guest unexpectedly by error handling code.
>
> Signed-off-by: Tomoki Sekiyama <tomoki.sekiyama at hds.com>
> ---
> src/qemu/qemu_domain.c | 5 ++++
> src/qemu/qemu_domain.h | 2 +
> src/qemu/qemu_driver.c | 66 +++++++++++++++++++++++++++++++++++++++---------
> 3 files changed, 60 insertions(+), 13 deletions(-)
>
> diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
> index 7d375e5..1fb1652 100644
> --- a/src/qemu/qemu_domain.c
> +++ b/src/qemu/qemu_domain.c
> @@ -357,6 +357,9 @@ qemuDomainObjPrivateXMLFormat(virBufferPtr buf, void *data)
> virBufferAddLit(buf, "</devices>\n");
> }
>
> + if (priv->quiesced)
> + virBufferAddLit(buf, "<quiesced/>\n");
> +
> return 0;
> }
>
> @@ -518,6 +521,8 @@ qemuDomainObjPrivateXMLParse(xmlXPathContextPtr ctxt, void *data)
> }
> VIR_FREE(nodes);
>
> + priv->quiesced = virXPathBoolean("boolean(./quiesced)", ctxt) == 1;
> +
> return 0;
>
> error:
> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index b2830c4..5fb1665 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -176,6 +176,8 @@ struct _qemuDomainObjPrivate {
> char **qemuDevices; /* NULL-terminated list of devices aliases known to QEMU */
>
> bool hookRun; /* true if there was a hook run over this domain */
> +
> + bool quiesced; /* true if the domain filesystems are quiesced */
> };
>
> typedef enum {
> diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> index 2707bec..bd469ba 100644
> --- a/src/qemu/qemu_driver.c
> +++ b/src/qemu/qemu_driver.c
> @@ -12005,31 +12005,60 @@ cleanup:
> }
>
>
> +/* Return -1 if request is not sent to agent due to misconfig, -2 if request
> + * is sent but failed, and number of frozen filesystems on success. */
> static int
> -qemuDomainSnapshotFSFreeze(virDomainObjPtr vm) {
> +qemuDomainSnapshotFSFreeze(virQEMUDriverPtr driver, virDomainObjPtr vm) {
> qemuDomainObjPrivatePtr priv = vm->privateData;
> + virQEMUDriverConfigPtr cfg;
> int freezed;
>
> if (!qemuDomainAgentAvailable(priv, true))
> return -1;
>
> + if (priv->quiesced) {
> + virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("domain is already quiesced"));
> + return -1;
> + }
> +
> qemuDomainObjEnterAgent(vm);
> freezed = qemuAgentFSFreeze(priv->agent);
> qemuDomainObjExitAgent(vm);
>
> - return freezed;
> + if (freezed >= 0)
> + priv->quiesced = true;
> +
> + cfg = virQEMUDriverGetConfig(driver);
> + if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) {
> + virObjectUnref(cfg);
> + return -2;
> + }
> + virObjectUnref(cfg);
> +
> + return freezed < 0 ? -2 : freezed;
> }
>
> +/* Return -1 if request is not sent to agent due to misconfig, -2 if request
> + * is send but failed, and number of thawed filesystems on success. */
> static int
> -qemuDomainSnapshotFSThaw(virDomainObjPtr vm, bool report)
> +qemuDomainSnapshotFSThaw(virQEMUDriverPtr driver,
> + virDomainObjPtr vm, bool report)
> {
> qemuDomainObjPrivatePtr priv = vm->privateData;
> + virQEMUDriverConfigPtr cfg;
> int thawed;
> virErrorPtr err = NULL;
>
> if (!qemuDomainAgentAvailable(priv, report))
> return -1;
>
> + if (!priv->quiesced && report) {
> + virReportError(VIR_ERR_OPERATION_INVALID, "%s",
> + _("domain is not quiesced"));
> + return -1;
> + }
> +
> qemuDomainObjEnterAgent(vm);
> if (!report)
> err = virSaveLastError();
> @@ -12038,8 +12067,18 @@ qemuDomainSnapshotFSThaw(virDomainObjPtr vm, bool report)
> virSetError(err);
> qemuDomainObjExitAgent(vm);
>
> + if (thawed >= 0)
> + priv->quiesced = false;
> +
> + cfg = virQEMUDriverGetConfig(driver);
> + if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0) {
> + virObjectUnref(cfg);
> + return -2;
> + }
> + virObjectUnref(cfg);
> +
> virFreeError(err);
> - return thawed;
> + return thawed < 0 ? -2 : thawed;
> }
>
> /* The domain is expected to be locked and inactive. */
> @@ -13014,17 +13053,18 @@ qemuDomainSnapshotCreateActiveExternal(virConnectPtr conn,
> goto cleanup;
>
> /* If quiesce was requested, then issue a freeze command, and a
> - * counterpart thaw command, no matter what. The command will
> - * fail if the guest is paused or the guest agent is not
> - * running. */
> + * counterpart thaw command when the it is actually sent to agent.
Small typo "the it is".
It appears a rebase is in order, at least the 3rd patch in the set will
not apply cleanly without intervention - but it's an easy fix.
I'll test these tomorrow and report results. Thanks for this patch.
--
Jon
More information about the libvir-list
mailing list