[libvirt] [PATCH 1/4] libxl: honor domain lifecycle event configuration
Michal Privoznik
mprivozn at redhat.com
Mon Feb 24 13:39:41 UTC 2014
On 21.02.2014 00:02, 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)) {
Funny, my gcc-4.8.2 warns me about @reason may be used uninitialized here.
> + 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);
Right. You've already notice that needs to be libxlVmCleanupJob().
> + libxlVmStart(driver, vm, 0, -1);
> +
> +cleanup:
> if (vm)
> virObjectUnlock(vm);
> if (dom_event)
>
ACK with this squashed in:
diff --git a/src/libxl/libxl_driver.c b/src/libxl/libxl_driver.c
index 721577d..0b9bf7d 100644
--- a/src/libxl/libxl_driver.c
+++ b/src/libxl/libxl_driver.c
@@ -368,7 +368,7 @@ libxlDomainShutdownThread(void *opaque)
libxl_ctx *ctx = priv->ctx;
virObjectEventPtr dom_event = NULL;
libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason;
- virDomainShutoffReason reason;
+ virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
virObjectLock(vm);
@@ -376,7 +376,7 @@ libxlDomainShutdownThread(void *opaque)
dom_event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
- switch (vm->def->onPoweroff) {
+ switch ((enum virDomainLifecycleAction) vm->def->onPoweroff) {
case VIR_DOMAIN_LIFECYCLE_DESTROY:
reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
goto destroy;
@@ -384,13 +384,14 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
goto restart;
case VIR_DOMAIN_LIFECYCLE_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_LAST:
goto cleanup;
}
} else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) {
dom_event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_CRASHED);
- switch (vm->def->onCrash) {
+ switch ((enum virDomainLifecycleCrashAction) vm->def->onCrash) {
case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY:
reason = VIR_DOMAIN_SHUTOFF_CRASHED;
goto destroy;
@@ -398,13 +399,16 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME:
goto restart;
case VIR_DOMAIN_LIFECYCLE_CRASH_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY:
+ case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART:
+ case VIR_DOMAIN_LIFECYCLE_CRASH_LAST:
goto cleanup;
}
} else if (xl_reason == LIBXL_SHUTDOWN_REASON_REBOOT) {
dom_event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
- switch (vm->def->onReboot) {
+ switch ((enum virDomainLifecycleAction) vm->def->onReboot) {
case VIR_DOMAIN_LIFECYCLE_DESTROY:
reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
goto destroy;
@@ -412,6 +416,7 @@ libxlDomainShutdownThread(void *opaque)
case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
goto restart;
case VIR_DOMAIN_LIFECYCLE_PRESERVE:
+ case VIR_DOMAIN_LIFECYCLE_LAST:
goto cleanup;
}
} else {
@@ -431,7 +436,7 @@ destroy:
restart:
libxl_domain_destroy(ctx, vm->def->id, NULL);
- libxlVmCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
+ libxlVmCleanupJob(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN);
libxlVmStart(driver, vm, 0, -1);
cleanup:
Michal
More information about the libvir-list
mailing list