提交 e9c27344 编写于 作者: J Jim Fehlig

libxl: rework setting the state of virDomainObj

Set the state of virDomainObj in the functions that
actually change the domain state, instead of the generic
libxlDomainCleanup function. This approach gives functions
calling libxlDomainCleanup more flexibility wrt when and
how they change virDomainObj state via virDomainObjSetState.

The prior approach of calling virDomainObjSetState in
libxlDomainCleanup resulted in the following incorrect
coding pattern in the various functions that change
domain state

 libxlDomain<DoStateTransition>
   call libxl function to do state transition
   emit lifecycle event
   libxlDomainCleanup
     virDomainObjSetState

Once simple manifestation of this bug is seeing a domain
running in virt-manager after selecting the shutdown button,
even after the domain has long shutdown.
上级 45697fe5
...@@ -397,7 +397,6 @@ libxlDomainShutdownThread(void *opaque) ...@@ -397,7 +397,6 @@ libxlDomainShutdownThread(void *opaque)
libxlDriverPrivatePtr driver = shutdown_info->driver; libxlDriverPrivatePtr driver = shutdown_info->driver;
virObjectEventPtr dom_event = NULL; virObjectEventPtr dom_event = NULL;
libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason; libxl_shutdown_reason xl_reason = ev->u.domain_shutdown.shutdown_reason;
virDomainShutoffReason reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
libxlDriverConfigPtr cfg; libxlDriverConfigPtr cfg;
cfg = libxlDriverConfigGet(driver); cfg = libxlDriverConfigGet(driver);
...@@ -406,12 +405,14 @@ libxlDomainShutdownThread(void *opaque) ...@@ -406,12 +405,14 @@ libxlDomainShutdownThread(void *opaque)
goto cleanup; goto cleanup;
if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) { if (xl_reason == LIBXL_SHUTDOWN_REASON_POWEROFF) {
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_SHUTDOWN);
dom_event = virDomainEventLifecycleNewFromObj(vm, dom_event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
switch ((virDomainLifecycleAction) vm->def->onPoweroff) { switch ((virDomainLifecycleAction) vm->def->onPoweroff) {
case VIR_DOMAIN_LIFECYCLE_DESTROY: case VIR_DOMAIN_LIFECYCLE_DESTROY:
reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
goto destroy; goto destroy;
case VIR_DOMAIN_LIFECYCLE_RESTART: case VIR_DOMAIN_LIFECYCLE_RESTART:
case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME: case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
...@@ -421,12 +422,14 @@ libxlDomainShutdownThread(void *opaque) ...@@ -421,12 +422,14 @@ libxlDomainShutdownThread(void *opaque)
goto endjob; goto endjob;
} }
} else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) { } else if (xl_reason == LIBXL_SHUTDOWN_REASON_CRASH) {
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_CRASHED);
dom_event = virDomainEventLifecycleNewFromObj(vm, dom_event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_CRASHED); VIR_DOMAIN_EVENT_STOPPED_CRASHED);
switch ((virDomainLifecycleCrashAction) vm->def->onCrash) { switch ((virDomainLifecycleCrashAction) vm->def->onCrash) {
case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY: case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY:
reason = VIR_DOMAIN_SHUTOFF_CRASHED;
goto destroy; goto destroy;
case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART: case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART:
case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME: case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART_RENAME:
...@@ -442,12 +445,14 @@ libxlDomainShutdownThread(void *opaque) ...@@ -442,12 +445,14 @@ libxlDomainShutdownThread(void *opaque)
goto restart; goto restart;
} }
} else if (xl_reason == LIBXL_SHUTDOWN_REASON_REBOOT) { } else if (xl_reason == LIBXL_SHUTDOWN_REASON_REBOOT) {
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_SHUTDOWN);
dom_event = virDomainEventLifecycleNewFromObj(vm, dom_event = virDomainEventLifecycleNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN); VIR_DOMAIN_EVENT_STOPPED_SHUTDOWN);
switch ((virDomainLifecycleAction) vm->def->onReboot) { switch ((virDomainLifecycleAction) vm->def->onReboot) {
case VIR_DOMAIN_LIFECYCLE_DESTROY: case VIR_DOMAIN_LIFECYCLE_DESTROY:
reason = VIR_DOMAIN_SHUTOFF_SHUTDOWN;
goto destroy; goto destroy;
case VIR_DOMAIN_LIFECYCLE_RESTART: case VIR_DOMAIN_LIFECYCLE_RESTART:
case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME: case VIR_DOMAIN_LIFECYCLE_RESTART_RENAME:
...@@ -467,7 +472,7 @@ libxlDomainShutdownThread(void *opaque) ...@@ -467,7 +472,7 @@ libxlDomainShutdownThread(void *opaque)
dom_event = NULL; dom_event = NULL;
} }
libxlDomainDestroyInternal(driver, vm); libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, reason); libxlDomainCleanup(driver, vm);
if (!vm->persistent) if (!vm->persistent)
virDomainObjListRemove(driver->domains, vm); virDomainObjListRemove(driver->domains, vm);
...@@ -479,7 +484,7 @@ libxlDomainShutdownThread(void *opaque) ...@@ -479,7 +484,7 @@ libxlDomainShutdownThread(void *opaque)
dom_event = NULL; dom_event = NULL;
} }
libxlDomainDestroyInternal(driver, vm); libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SHUTDOWN); libxlDomainCleanup(driver, vm);
if (libxlDomainStart(driver, vm, false, -1) < 0) { if (libxlDomainStart(driver, vm, false, -1) < 0) {
virErrorPtr err = virGetLastError(); virErrorPtr err = virGetLastError();
VIR_ERROR(_("Failed to restart VM '%s': %s"), VIR_ERROR(_("Failed to restart VM '%s': %s"),
...@@ -685,8 +690,7 @@ libxlDomainDestroyInternal(libxlDriverPrivatePtr driver, ...@@ -685,8 +690,7 @@ libxlDomainDestroyInternal(libxlDriverPrivatePtr driver,
*/ */
void void
libxlDomainCleanup(libxlDriverPrivatePtr driver, libxlDomainCleanup(libxlDriverPrivatePtr driver,
virDomainObjPtr vm, virDomainObjPtr vm)
virDomainShutoffReason reason)
{ {
libxlDomainObjPrivatePtr priv = vm->privateData; libxlDomainObjPrivatePtr priv = vm->privateData;
libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver); libxlDriverConfigPtr cfg = libxlDriverConfigGet(driver);
...@@ -709,9 +713,6 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver, ...@@ -709,9 +713,6 @@ libxlDomainCleanup(libxlDriverPrivatePtr driver,
priv->deathW = NULL; priv->deathW = NULL;
} }
if (vm->persistent)
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF, reason);
if (virAtomicIntDecAndTest(&driver->nactive) && driver->inhibitCallback) if (virAtomicIntDecAndTest(&driver->nactive) && driver->inhibitCallback)
driver->inhibitCallback(false, driver->inhibitOpaque); driver->inhibitCallback(false, driver->inhibitOpaque);
......
...@@ -110,8 +110,7 @@ libxlDomainDestroyInternal(libxlDriverPrivatePtr driver, ...@@ -110,8 +110,7 @@ libxlDomainDestroyInternal(libxlDriverPrivatePtr driver,
void void
libxlDomainCleanup(libxlDriverPrivatePtr driver, libxlDomainCleanup(libxlDriverPrivatePtr driver,
virDomainObjPtr vm, virDomainObjPtr vm);
virDomainShutoffReason reason);
/* /*
* Note: Xen 4.3 removed the const from the event handler signature. * Note: Xen 4.3 removed the const from the event handler signature.
......
...@@ -392,7 +392,7 @@ libxlReconnectDomain(virDomainObjPtr vm, ...@@ -392,7 +392,7 @@ libxlReconnectDomain(virDomainObjPtr vm,
return 0; return 0;
out: out:
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_UNKNOWN); libxlDomainCleanup(driver, vm);
if (!vm->persistent) if (!vm->persistent)
virDomainObjListRemoveLocked(driver->domains, vm); virDomainObjListRemoveLocked(driver->domains, vm);
else else
...@@ -1346,16 +1346,19 @@ libxlDomainDestroyFlags(virDomainPtr dom, ...@@ -1346,16 +1346,19 @@ libxlDomainDestroyFlags(virDomainPtr dom,
goto endjob; goto endjob;
} }
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
if (libxlDomainDestroyInternal(driver, vm) < 0) { if (libxlDomainDestroyInternal(driver, vm) < 0) {
virReportError(VIR_ERR_INTERNAL_ERROR, virReportError(VIR_ERR_INTERNAL_ERROR,
_("Failed to destroy domain '%d'"), vm->def->id); _("Failed to destroy domain '%d'"), vm->def->id);
goto endjob; goto endjob;
} }
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_DESTROYED); virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_DESTROYED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_DESTROYED);
libxlDomainCleanup(driver, vm);
if (!vm->persistent) if (!vm->persistent)
virDomainObjListRemove(driver->domains, vm); virDomainObjListRemove(driver->domains, vm);
...@@ -1689,6 +1692,9 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm, ...@@ -1689,6 +1692,9 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
goto cleanup; goto cleanup;
} }
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_SAVED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_SAVED); VIR_DOMAIN_EVENT_STOPPED_SAVED);
...@@ -1698,7 +1704,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm, ...@@ -1698,7 +1704,7 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
goto cleanup; goto cleanup;
} }
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED); libxlDomainCleanup(driver, vm);
vm->hasManagedSave = true; vm->hasManagedSave = true;
ret = 0; ret = 0;
...@@ -1909,7 +1915,9 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags) ...@@ -1909,7 +1915,9 @@ libxlDomainCoreDump(virDomainPtr dom, const char *to, unsigned int flags)
goto unpause; goto unpause;
} }
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED); libxlDomainCleanup(driver, vm);
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_CRASHED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_CRASHED); VIR_DOMAIN_EVENT_STOPPED_CRASHED);
if (!vm->persistent) if (!vm->persistent)
......
...@@ -585,7 +585,9 @@ libxlDomainMigrationFinish(virConnectPtr dconn, ...@@ -585,7 +585,9 @@ libxlDomainMigrationFinish(virConnectPtr dconn,
cleanup: cleanup:
if (dom == NULL) { if (dom == NULL) {
libxlDomainDestroyInternal(driver, vm); libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED); libxlDomainCleanup(driver, vm);
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_FAILED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_FAILED); VIR_DOMAIN_EVENT_STOPPED_FAILED);
if (!vm->persistent) if (!vm->persistent)
...@@ -624,7 +626,9 @@ libxlDomainMigrationConfirm(libxlDriverPrivatePtr driver, ...@@ -624,7 +626,9 @@ libxlDomainMigrationConfirm(libxlDriverPrivatePtr driver,
} }
libxlDomainDestroyInternal(driver, vm); libxlDomainDestroyInternal(driver, vm);
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_MIGRATED); libxlDomainCleanup(driver, vm);
virDomainObjSetState(vm, VIR_DOMAIN_SHUTOFF,
VIR_DOMAIN_SHUTOFF_MIGRATED);
event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, event = virDomainEventLifecycleNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_MIGRATED); VIR_DOMAIN_EVENT_STOPPED_MIGRATED);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册