[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