[libvirt] [PATCH 2/4] libxl: queue domain event earlier in shutdown handler

Jim Fehlig jfehlig at suse.com
Mon Feb 24 16:04:04 UTC 2014


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 at 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
>




More information about the libvir-list mailing list