[libvirt] [PATCH] qemu: add two hook script events "prepare" and "release"
Daniel Veillard
veillard at redhat.com
Tue Mar 22 09:59:52 UTC 2011
On Mon, Mar 21, 2011 at 10:36:55AM +0100, Thibault VINCENT wrote:
> >From 827261dbe2ab8f1cfd8c84df14bb42fd04df2307 Mon Sep 17 00:00:00 2001
> From: Thibault VINCENT <thibault.vincent at smartjog.com>
> Date: Mon, 21 Mar 2011 10:18:06 +0100
> Subject: [PATCH] qemu: add two hook script events "prepare" and "release"
>
> * Fix for bug #618970
>
> * The "prepare" hook is called very early in the VM statup process
> before device labeling, so that it can allocate ressources not
> managed by libvirt, such as DRBD, or for instance create missing
> bridges and vlan interfaces.
>
> * To shutdown these devices, the "release" hook is also required at
> the very end of the VM destruction.
>
> Signed-off-by: Thibault VINCENT <thibault.vincent at smartjog.com>
> ---
> src/qemu/qemu_process.c | 26 ++++++++++++++++++++++++++
> src/util/hooks.c | 4 +++-
> src/util/hooks.h | 2 ++
> 3 files changed, 31 insertions(+), 1 deletions(-)
>
> diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
> index 793a43c..7831c3b 100644
> --- a/src/qemu/qemu_process.c
> +++ b/src/qemu/qemu_process.c
> @@ -1927,6 +1927,22 @@ int qemuProcessStart(virConnectPtr conn,
>
> vm->def->id = driver->nextvmid++;
>
> + /* Run a early hook to set-up missing devices */
> + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
> + char *xml = virDomainDefFormat(vm->def, 0);
> + int hookret;
> +
> + hookret = virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
> + VIR_HOOK_QEMU_OP_PREPARE, VIR_HOOK_SUBOP_BEGIN,
> NULL, xml);
> + VIR_FREE(xml);
> +
> + /*
> + * If the script raised an error abort the launch
> + */
> + if (hookret < 0)
> + goto cleanup;
> + }
Hum, the main problem I see there is that we may fail startup there
and go to cleanup. In that case the domain is not started but no hook is
called to reverse the operation. I wonder if VIR_HOOK_QEMU_OP_RELEASE
shouldn't be called in the cleanup ... if present, to avoid resource
leak when startup fails.
> /* Must be run before security labelling */
> VIR_DEBUG0("Preparing host devices");
> if (qemuPrepareHostDevices(driver, vm->def) < 0)
> @@ -2419,6 +2435,16 @@ retry:
> VIR_FREE(priv->vcpupids);
> priv->nvcpupids = 0;
>
> + /* The "release" hook cleans up additional ressources */
> + if (virHookPresent(VIR_HOOK_DRIVER_QEMU)) {
> + char *xml = virDomainDefFormat(vm->def, 0);
> +
> + /* we can't stop the operation even if the script raised an
> error */
> + virHookCall(VIR_HOOK_DRIVER_QEMU, vm->def->name,
> + VIR_HOOK_QEMU_OP_RELEASE, VIR_HOOK_SUBOP_END, NULL,
> xml);
> + VIR_FREE(xml);
> + }
> +
That's okay, but possibly not sufficient.
> if (vm->newDef) {
> virDomainDefFree(vm->def);
> vm->def = vm->newDef;
> diff --git a/src/util/hooks.c b/src/util/hooks.c
> index 5ba2036..c258318 100644
> --- a/src/util/hooks.c
> +++ b/src/util/hooks.c
> @@ -70,8 +70,10 @@ VIR_ENUM_IMPL(virHookSubop, VIR_HOOK_SUBOP_LAST,
> "end")
>
> VIR_ENUM_IMPL(virHookQemuOp, VIR_HOOK_QEMU_OP_LAST,
> + "prepare",
> "start",
> - "stopped")
> + "stopped",
> + "release")
prepare should be added after stopped to avoid changing the order.
> VIR_ENUM_IMPL(virHookLxcOp, VIR_HOOK_LXC_OP_LAST,
> "start",
> diff --git a/src/util/hooks.h b/src/util/hooks.h
> index f311ed1..66b378a 100644
> --- a/src/util/hooks.h
> +++ b/src/util/hooks.h
> @@ -52,8 +52,10 @@ enum virHookSubopType {
> };
>
> enum virHookQemuOpType {
> + VIR_HOOK_QEMU_OP_PREPARE, /* domain startup initiated */
> VIR_HOOK_QEMU_OP_START, /* domain is about to start */
> VIR_HOOK_QEMU_OP_STOPPED, /* domain has stopped */
> + VIR_HOOK_QEMU_OP_RELEASE, /* domain destruction is over */
same thing, only add at the end.
> VIR_HOOK_QEMU_OP_LAST,
> };
Fixing the 2 last problems is trivial and I did it in my tree, but I
don't feel like commiting this without handling the failure to start
the domain (running VIR_HOOK_QEMU_OP_RELEASE with a new virHookSubopType
VIR_HOOK_SUBOP_FAILED for example).
Daniel
--
Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/
daniel at veillard.com | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library http://libvirt.org/
More information about the libvir-list
mailing list