[libvirt] [PATCH RFC] Add domainSave/Restore to libxl driver
Markus Groß
gross at univention.de
Fri May 27 06:01:53 UTC 2011
Quoting Jim Fehlig <jfehlig at novell.com>:
> Markus Groß wrote:
>> Am Dienstag 24 Mai 2011 06:06:08 schrieb Jim Fehlig:
>>
>>>> +
>>>> + event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
>>>> + VIR_DOMAIN_EVENT_STOPPED_SAVED);
>>>> +
>>>> + if (libxlVmReap(driver, vm, 1, VIR_DOMAIN_SHUTOFF_SAVED) != 0) {
>>>> + libxlError(VIR_ERR_INTERNAL_ERROR,
>>>> + _("Failed to destroy domain '%d'"), dom->id);
>>>> + goto cleanup;
>>>> + }
>>>>
>>>>
>>> And here call libxl_domain_destroy() directly instead of libxlVmReap(),
>>> allowing the event handler to cleanup the vm.
>>>
>>> Can you make these changes and ensure all the save/restore issues are
>>> resolved in your environment?
>>>
>>
>> I made these changes but this leads to another issue.
>> When using the event handler to cleanup the domain
>> there seems to be a race condition.
>> The call to libxl_event_get_domain_death_info returns a value != 1
>>
>
> That should be fine though. libxl_event_get_domain_death_info() will
> return 1 if the event is for the specified domid. If it returns a value
> != 1, we goto cleanup and keep listening.
>
>> sometimes and the domain gets not cleaned up.
>>
>
> Did you use the force flag when invoking
> libxl_event_get_domain_death_info()? I've noticed that no events are
> generated when using that flag.
Yes, I used the force flag.
>
>> The latest version of the patch I posted in this thread earlier does
>> not have this issue as it cleans up the domain directly.
>>
>
> How about this adjustment to your latest version? I can't find any
> issues using this change, and it follows the same pattern used in xl client.
>
I experienced the described behavior using this adjustment, except
that I used the force flag. I will test the patch again without using
the force flag and will repost it. Unfortunately that has to wait till
monday as I am out of the office now.
Cheers,
Markus
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -378,6 +378,9 @@ static void libxlEventHandler(int watch,
> libxlVmReap(driver, vm, 0, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
> libxlVmStart(driver, vm, 0, -1);
> break;
> + case SHUTDOWN_suspend:
> + libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED);
> + break;
> default:
> VIR_INFO("Unhandled shutdown_reason %d",
> info.shutdown_reason);
> break;
> @@ -1719,7 +1722,7 @@ libxlDomainSave(virDomainPtr dom, const char *to)
> event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
> VIR_DOMAIN_EVENT_STOPPED_SAVED);
>
> - if (libxlVmReap(driver, vm, 1, VIR_DOMAIN_SHUTOFF_SAVED) != 0) {
> + if (libxl_domain_destroy(&priv->ctx, dom->id, 0) < 0) {
> libxlError(VIR_ERR_INTERNAL_ERROR,
> _("Failed to destroy domain '%d'"), dom->id);
> goto cleanup;
>
>
More information about the libvir-list
mailing list