mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-12-23 14:15:28 +00:00
libxl: destroy domain in migration finish phase on failure
This patch contains three domain cleanup improvements in the migration finish phase, ensuring a domain is properly disposed when a failure is detected or the migration is cancelled. The check for virDomainObjIsActive is moved to libxlDomainMigrationFinish, where cleanup can occur if migration failed and the domain is inactive. The 'cleanup' label was missplaced in libxlDomainMigrationFinish, causing a migrated domain to remain in the event of an error or cancelled migration. In cleanup, the domain was not removed from the driver's list of domains. Signed-off-by: Jim Fehlig <jfehlig@suse.com>
This commit is contained in:
parent
6038682564
commit
42874fa45f
@ -4686,17 +4686,8 @@ libxlDomainMigrateFinish3Params(virConnectPtr dconn,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!virDomainObjIsActive(vm)) {
|
|
||||||
/* Migration failed if domain is inactive */
|
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
||||||
"%s", _("Migration failed. Domain is not running "
|
|
||||||
"on destination host"));
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
ret = libxlDomainMigrationFinish(dconn, vm, flags, cancelled);
|
ret = libxlDomainMigrationFinish(dconn, vm, flags, cancelled);
|
||||||
|
|
||||||
endjob:
|
|
||||||
if (!libxlDomainObjEndJob(driver, vm))
|
if (!libxlDomainObjEndJob(driver, vm))
|
||||||
vm = NULL;
|
vm = NULL;
|
||||||
|
|
||||||
|
@ -537,6 +537,16 @@ libxlDomainMigrationFinish(virConnectPtr dconn,
|
|||||||
if (cancelled)
|
if (cancelled)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
|
/* Check if domain is alive */
|
||||||
|
if (!virDomainObjIsActive(vm)) {
|
||||||
|
/* Migration failed if domain is inactive */
|
||||||
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
|
"%s", _("Migration failed. Domain is not running "
|
||||||
|
"on destination host"));
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Unpause if requested */
|
||||||
if (!(flags & VIR_MIGRATE_PAUSED)) {
|
if (!(flags & VIR_MIGRATE_PAUSED)) {
|
||||||
if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
|
if (libxl_domain_unpause(priv->ctx, vm->def->id) != 0) {
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
|
||||||
@ -556,24 +566,26 @@ libxlDomainMigrationFinish(virConnectPtr dconn,
|
|||||||
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
|
VIR_DOMAIN_EVENT_SUSPENDED_PAUSED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
|
|
||||||
goto cleanup;
|
|
||||||
|
|
||||||
if (event) {
|
if (event) {
|
||||||
libxlDomainEventQueue(driver, event);
|
libxlDomainEventQueue(driver, event);
|
||||||
event = NULL;
|
event = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
dom = virGetDomain(dconn, vm->def->name, vm->def->uuid);
|
dom = virGetDomain(dconn, vm->def->name, vm->def->uuid);
|
||||||
|
|
||||||
|
cleanup:
|
||||||
if (dom == NULL) {
|
if (dom == NULL) {
|
||||||
libxl_domain_destroy(priv->ctx, vm->def->id, NULL);
|
libxl_domain_destroy(priv->ctx, vm->def->id, NULL);
|
||||||
libxlDomainCleanup(driver, vm, VIR_DOMAIN_SHUTOFF_FAILED);
|
libxlDomainCleanup(driver, vm, 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)
|
||||||
|
virDomainObjListRemove(driver->domains, vm);
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
|
||||||
if (event)
|
if (event)
|
||||||
libxlDomainEventQueue(driver, event);
|
libxlDomainEventQueue(driver, event);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
|
Loading…
Reference in New Issue
Block a user