Michal Privoznik wrote:
On 21.02.2014 00:02, Jim Fehlig wrote:
> The shutdown handler may restart a domain when handling a reboot
> event or when <on_*> is set to 'restart'. Restarting consists of
> calling libxlVmCleanup followed by libxlVmStart. libxlVmStart will
> emit a VIR_DOMAIN_EVENT_STARTED event, but the SHUTDOWN event is
> not emitted until exiting the shutdown handler, after the STARTED
> event. Queue the event immediately after creation to avoid emitting
> it after the start event.
>
> Signed-off-by: Jim Fehlig <jfehlig(a)suse.com>
> ---
> src/libxl/libxl_driver.c | 8 ++++++--
> 1 file changed, 6 insertions(+), 2 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index 721577d..e600de7 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -376,6 +376,8 @@ libxlDomainShutdownThread(void *opaque)
> dom_event = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_STOPPED,
>
> VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
> + if (dom_event)
> + libxlDomainEventQueue(driver, dom_event);
> switch (vm->def->onPoweroff) {
> case VIR_DOMAIN_LIFECYCLE_DESTROY:
> reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
> @@ -390,6 +392,8 @@ libxlDomainShutdownThread(void *opaque)
> dom_event = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_STOPPED,
>
> VIR_DOMAIN_EVENT_STOPPED_CRASHED);
> + if (dom_event)
> + libxlDomainEventQueue(driver, dom_event);
> switch (vm->def->onCrash) {
> case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY:
> reason = VIR_DOMAIN_SHUTOFF_CRASHED;
> @@ -404,6 +408,8 @@ libxlDomainShutdownThread(void *opaque)
> dom_event = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_STOPPED,
>
> VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
> + if (dom_event)
> + libxlDomainEventQueue(driver, dom_event);
> switch (vm->def->onReboot) {
> case VIR_DOMAIN_LIFECYCLE_DESTROY:
> reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
> @@ -437,8 +443,6 @@ restart:
> cleanup:
> if (vm)
> virObjectUnlock(vm);
> - if (dom_event)
> - libxlDomainEventQueue(driver, dom_event);
> libxl_event_free(ctx, ev);
> VIR_FREE(shutdown_info);
> }
>
Wouldn't it be better to enqueue events at the beginning of 'destroy'
and 'restart' labels? I'm thinking about something among these lines:
Yes, agreed. As discussed on IRC, better to enqueue the event at the
labels since it is one less call to libxlDomainEventQueue, and improves
the code to handle any future <on_foo> action.
Regards,
Jim
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 0b9bf7d..c009407 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -425,6 +425,10 @@ libxlDomainShutdownThread(void *opaque)
}
destroy:
+ if (dom_event) {
+ libxlDomainEventQueue(driver, dom_event);
+ dom_event = NULL;
+ }
libxl_domain_destroy(ctx, vm->def->id, NULL);
if (libxlVmCleanupJob(driver, vm, reason)) {
if (!vm->persistent) {
@@ -435,6 +439,10 @@ destroy:
goto cleanup;
restart:
+ if (dom_event) {
+ libxlDomainEventQueue(driver, dom_event);
+ dom_event = NULL;
+ }
libxl_domain_destroy(ctx, vm->def->id, NULL);
libxlVmCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
libxlVmStart(driver, vm, 0, -1);
Michal