mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: Start an async job for processGuestPanicEvent
Only a small portion of processGuestPanicEvent was enclosed within a job, let's make sure we use the job for all operations to avoid race conditions. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
26edd68c35
commit
1894112bb7
@ -3986,17 +3986,6 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver,
|
|||||||
timestr) < 0)
|
timestr) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (qemuDomainObjBeginAsyncJob(driver, vm,
|
|
||||||
QEMU_ASYNC_JOB_DUMP) < 0) {
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!virDomainObjIsActive(vm)) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
"%s", _("domain is not running"));
|
|
||||||
goto endjob;
|
|
||||||
}
|
|
||||||
|
|
||||||
flags |= cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0;
|
flags |= cfg->autoDumpBypassCache ? VIR_DUMP_BYPASS_CACHE: 0;
|
||||||
ret = doCoreDump(driver, vm, dumpfile,
|
ret = doCoreDump(driver, vm, dumpfile,
|
||||||
getCompressionType(driver), flags,
|
getCompressionType(driver), flags,
|
||||||
@ -4004,10 +3993,6 @@ doCoreDumpToAutoDumpPath(virQEMUDriverPtr driver,
|
|||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED,
|
virReportError(VIR_ERR_OPERATION_FAILED,
|
||||||
"%s", _("Dump failed"));
|
"%s", _("Dump failed"));
|
||||||
|
|
||||||
endjob:
|
|
||||||
qemuDomainObjEndAsyncJob(driver, vm);
|
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FREE(dumpfile);
|
VIR_FREE(dumpfile);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
@ -4022,11 +4007,15 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
|
|||||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||||
virObjectEventPtr event = NULL;
|
virObjectEventPtr event = NULL;
|
||||||
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
||||||
|
bool removeInactive = false;
|
||||||
|
|
||||||
|
if (qemuDomainObjBeginAsyncJob(driver, vm, QEMU_ASYNC_JOB_DUMP) < 0)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
if (!virDomainObjIsActive(vm)) {
|
if (!virDomainObjIsActive(vm)) {
|
||||||
VIR_DEBUG("Ignoring GUEST_PANICKED event from inactive domain %s",
|
VIR_DEBUG("Ignoring GUEST_PANICKED event from inactive domain %s",
|
||||||
vm->def->name);
|
vm->def->name);
|
||||||
goto cleanup;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
virDomainObjSetState(vm,
|
virDomainObjSetState(vm,
|
||||||
@ -4039,6 +4028,11 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
qemuDomainEventQueue(driver, event);
|
qemuDomainEventQueue(driver, event);
|
||||||
|
|
||||||
|
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) {
|
||||||
|
VIR_WARN("Unable to save status on vm %s after state change",
|
||||||
|
vm->def->name);
|
||||||
|
}
|
||||||
|
|
||||||
if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
|
if (virDomainLockProcessPause(driver->lockManager, vm, &priv->lockState) < 0)
|
||||||
VIR_WARN("Unable to release lease on %s", vm->def->name);
|
VIR_WARN("Unable to release lease on %s", vm->def->name);
|
||||||
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
|
VIR_DEBUG("Preserving lock state '%s'", NULLSTR(priv->lockState));
|
||||||
@ -4046,40 +4040,23 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
|
|||||||
switch (action) {
|
switch (action) {
|
||||||
case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY:
|
case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_DESTROY:
|
||||||
if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0)
|
if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0)
|
||||||
goto cleanup;
|
goto endjob;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY:
|
case VIR_DOMAIN_LIFECYCLE_CRASH_DESTROY:
|
||||||
priv->beingDestroyed = true;
|
|
||||||
|
|
||||||
if (qemuProcessKill(vm, VIR_QEMU_PROCESS_KILL_FORCE) < 0) {
|
|
||||||
priv->beingDestroyed = false;
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
priv->beingDestroyed = false;
|
|
||||||
|
|
||||||
if (!virDomainObjIsActive(vm)) {
|
|
||||||
virReportError(VIR_ERR_OPERATION_INVALID,
|
|
||||||
"%s", _("domain is not running"));
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED, 0);
|
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_CRASHED, 0);
|
||||||
event = virDomainEventLifecycleNewFromObj(vm,
|
event = virDomainEventLifecycleNewFromObj(vm,
|
||||||
VIR_DOMAIN_EVENT_STOPPED,
|
VIR_DOMAIN_EVENT_STOPPED,
|
||||||
VIR_DOMAIN_EVENT_STOPPED_CRASHED);
|
VIR_DOMAIN_EVENT_STOPPED_CRASHED);
|
||||||
|
|
||||||
qemuDomainEventQueue(driver, event);
|
qemuDomainEventQueue(driver, event);
|
||||||
|
|
||||||
virDomainAuditStop(vm, "destroyed");
|
virDomainAuditStop(vm, "destroyed");
|
||||||
|
removeInactive = true;
|
||||||
qemuDomainRemoveInactive(driver, vm);
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART:
|
case VIR_DOMAIN_LIFECYCLE_CRASH_COREDUMP_RESTART:
|
||||||
if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0)
|
if (doCoreDumpToAutoDumpPath(driver, vm, VIR_DUMP_MEMORY_ONLY) < 0)
|
||||||
goto cleanup;
|
goto endjob;
|
||||||
/* fall through */
|
/* fall through */
|
||||||
|
|
||||||
case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART:
|
case VIR_DOMAIN_LIFECYCLE_CRASH_RESTART:
|
||||||
@ -4094,12 +4071,12 @@ processGuestPanicEvent(virQEMUDriverPtr driver,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
cleanup:
|
endjob:
|
||||||
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0) {
|
qemuDomainObjEndAsyncJob(driver, vm);
|
||||||
VIR_WARN("Unable to save status on vm %s after state change",
|
if (removeInactive)
|
||||||
vm->def->name);
|
qemuDomainRemoveInactive(driver, vm);
|
||||||
}
|
|
||||||
|
|
||||||
|
cleanup:
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user