
Quoting Jim Fehlig <jfehlig@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;