[libvirt] [PATCH 1/4] libxl: honor domain lifecycle event configuration
Jim Fehlig
jfehlig at suse.com
Fri Feb 21 00:19:24 UTC 2014
Jim Fehlig wrote:
> The libxl driver was ignoring the <on_*> domain event configuration,
> causing e.g. a domain to be rebooted even when on_reboot is set to
> destroy.
>
> This patch honors the <on_*> configuration in the shutdown event
> handler.
>
> Signed-off-by: Jim Fehlig <jfehlig at suse.com>
> ---
> src/libxl/libxl_driver.c | 83 +++++++++++++++++++++++++++++++++---------------
> 1 file changed, 57 insertions(+), 26 deletions(-)
>
> diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
> index c7c7b4f..721577d 100644
> --- a/src/libxl/libxl_driver.c
> +++ b/src/libxl/libxl_driver.c
> @@ -372,38 +372,69 @@ libxlDomainShutdownThread(void *opaque)
>
> virObjectLock(vm);
>
> - switch (xl_reason) {
> - case LIBXL_SHUTDOWN_REASON_POWEROFF:
> - case LIBXL_SHUTDOWN_REASON_CRASH:
> - if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) {
> - dom_event = virDomainEventLifecycleNewFromObj(vm,
> + if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) {
> + dom_event = virDomainEventLifecycleNewFromObj(vm,
> + VIR_DOMAIN_EVENT_STOPPED,
> + VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
> + switch (vm->def->onPoweroff) {
> + case VIR_DOMAIN_LIFECYCLE_DESTROY:
> + reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
> + goto destroy;
> + case VIR_DOMAIN_LIFECYCLE_RESTART:
> + case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
> + goto restart;
> + case VIR_DOMAIN_LIFECYCLE_PRESERVE:
> + goto cleanup;
> + }
> + } else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) {
> + dom_event = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_STOPPED,
> VIR_DOMAIN_EVENT_STOPPED_CRASHED);
> - reason = VIR_DOMAIN_SHUTOFF_CRASHED;
> - } else {
> - dom_event = virDomainEventLifecycleNewFromObj(vm,
> + switch (vm->def->onCrash) {
> + case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY:
> + reason = VIR_DOMAIN_SHUTOFF_CRASHED;
> + goto destroy;
> + case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART:
> + case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME:
> + goto restart;
> + case VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE:
> + goto cleanup;
> + }
> + } else if (xl_reason == LIBXL_SHUTDOWN_REASON_REBOOT) {
> + dom_event = virDomainEventLifecycleNewFromObj(vm,
> VIR_DOMAIN_EVENT_STOPPED,
> VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
> - reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
> - }
> - libxl_domain_destroy(ctx, vm->def->id, NULL);
> - if (libxlVmCleanupJob(driver, vm, reason)) {
> - if (!vm->persistent) {
> - virDomainObjListRemove(driver->domains, vm);
> - vm = NULL;
> - }
> - }
> - break;
> - case LIBXL_SHUTDOWN_REASON_REBOOT:
> - libxl_domain_destroy(ctx, vm->def->id, NULL);
> - libxlVmCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
> - libxlVmStart(driver, vm, 0, -1);
> - break;
> - default:
> - VIR_INFO("Unhandled shutdown_reason %d", xl_reason);
> - break;
> + switch (vm->def->onReboot) {
> + case VIR_DOMAIN_LIFECYCLE_DESTROY:
> + reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
> + goto destroy;
> + case VIR_DOMAIN_LIFECYCLE_RESTART:
> + case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
> + goto restart;
> + case VIR_DOMAIN_LIFECYCLE_PRESERVE:
> + goto cleanup;
> + }
> + } else {
> + VIR_INFO("Unhandled shutdown_reason %d", xl_reason);
> + goto cleanup;
> }
>
> +destroy:
> + libxl_domain_destroy(ctx, vm->def->id, NULL);
> + if (libxlVmCleanupJob(driver, vm, reason)) {
> + if (!vm->persistent) {
> + virDomainObjListRemove(driver->domains, vm);
> + vm = NULL;
> + }
> + }
> + goto cleanup;
> +
> +restart:
> + libxl_domain_destroy(ctx, vm->def->id, NULL);
> + libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
>
Opps, botched rebasing of my own branches. This should be
libxlVmCleanupJob. I've fixed it in my local branch.
Regards,
Jim
> + libxlVmStart(driver, vm, 0, -1);
> +
> +cleanup:
> if (vm)
> virObjectUnlock(vm);
> if (dom_event)
>
More information about the libvir-list
mailing list