qemu: Emit event if 'cont' fails

Some operations, APIs needs domain to be paused prior operation can be
performed, e.g. (managed-) save of a domain. The processors should be
restored in the end. However, if 'cont' fails for some reason, we log a
message but this is not sufficient as an event should be emitted as
well. Mgmt application can then decide what to do.
This commit is contained in:
Michal Privoznik 2012-11-05 15:33:12 +01:00
parent adb29a8869
commit a08fc66d90

View File

@ -2994,8 +2994,12 @@ endjob:
rc = qemuProcessStartCPUs(driver, vm, dom->conn, rc = qemuProcessStartCPUs(driver, vm, dom->conn,
VIR_DOMAIN_RUNNING_SAVE_CANCELED, VIR_DOMAIN_RUNNING_SAVE_CANCELED,
QEMU_ASYNC_JOB_SAVE); QEMU_ASYNC_JOB_SAVE);
if (rc < 0) if (rc < 0) {
VIR_WARN("Unable to resume guest CPUs after save failure"); VIR_WARN("Unable to resume guest CPUs after save failure");
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
}
} }
} }
if (qemuDomainObjEndAsyncJob(driver, vm) == 0) if (qemuDomainObjEndAsyncJob(driver, vm) == 0)
@ -3452,6 +3456,9 @@ endjob:
if (resume && qemuProcessStartCPUs(driver, vm, dom->conn, if (resume && qemuProcessStartCPUs(driver, vm, dom->conn,
VIR_DOMAIN_RUNNING_UNPAUSED, VIR_DOMAIN_RUNNING_UNPAUSED,
QEMU_ASYNC_JOB_DUMP) < 0) { QEMU_ASYNC_JOB_DUMP) < 0) {
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
virReportError(VIR_ERR_OPERATION_FAILED, virReportError(VIR_ERR_OPERATION_FAILED,
"%s", _("resuming after dump failed")); "%s", _("resuming after dump failed"));
@ -10669,6 +10676,7 @@ qemuDomainSnapshotCreateActiveInternal(virConnectPtr conn,
{ {
virDomainObjPtr vm = *vmptr; virDomainObjPtr vm = *vmptr;
qemuDomainObjPrivatePtr priv = vm->privateData; qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainEventPtr event = NULL;
bool resume = false; bool resume = false;
int ret = -1; int ret = -1;
@ -10705,8 +10713,6 @@ qemuDomainSnapshotCreateActiveInternal(virConnectPtr conn,
goto cleanup; goto cleanup;
if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) { if (flags & VIR_DOMAIN_SNAPSHOT_CREATE_HALT) {
virDomainEventPtr event;
event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED, event = virDomainEventNewFromObj(vm, VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT); VIR_DOMAIN_EVENT_STOPPED_FROM_SNAPSHOT);
qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT, 0); qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_FROM_SNAPSHOT, 0);
@ -10716,18 +10722,20 @@ qemuDomainSnapshotCreateActiveInternal(virConnectPtr conn,
ignore_value(qemuDomainObjEndJob(driver, vm)); ignore_value(qemuDomainObjEndJob(driver, vm));
resume = false; resume = false;
vm = NULL; vm = NULL;
if (event)
qemuDomainEventQueue(driver, event);
} }
cleanup: cleanup:
if (resume && virDomainObjIsActive(vm) && if (resume && virDomainObjIsActive(vm) &&
qemuProcessStartCPUs(driver, vm, conn, qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_UNPAUSED, VIR_DOMAIN_RUNNING_UNPAUSED,
QEMU_ASYNC_JOB_NONE) < 0 && QEMU_ASYNC_JOB_NONE) < 0) {
virGetLastError() == NULL) { event = virDomainEventNewFromObj(vm,
virReportError(VIR_ERR_OPERATION_FAILED, "%s", VIR_DOMAIN_EVENT_SUSPENDED,
_("resuming after snapshot failed")); VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
if (virGetLastError() == NULL) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("resuming after snapshot failed"));
}
} }
endjob: endjob:
@ -10738,6 +10746,9 @@ endjob:
ret = -1; ret = -1;
} }
if (event)
qemuDomainEventQueue(driver, event);
return ret; return ret;
} }
@ -11238,10 +11249,17 @@ endjob:
if (resume && vm && virDomainObjIsActive(vm) && if (resume && vm && virDomainObjIsActive(vm) &&
qemuProcessStartCPUs(driver, vm, conn, qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_UNPAUSED, VIR_DOMAIN_RUNNING_UNPAUSED,
QEMU_ASYNC_JOB_NONE) < 0 && QEMU_ASYNC_JOB_NONE) < 0) {
virGetLastError() == NULL) { virDomainEventPtr event = NULL;
virReportError(VIR_ERR_OPERATION_FAILED, "%s", event = virDomainEventNewFromObj(vm,
_("resuming after snapshot failed")); VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
if (event)
qemuDomainEventQueue(driver, event);
if (virGetLastError() == NULL) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("resuming after snapshot failed"));
}
return -1; return -1;
} }
@ -12818,10 +12836,17 @@ cleanup:
if (resume && virDomainObjIsActive(vm) && if (resume && virDomainObjIsActive(vm) &&
qemuProcessStartCPUs(driver, vm, conn, qemuProcessStartCPUs(driver, vm, conn,
VIR_DOMAIN_RUNNING_UNPAUSED, VIR_DOMAIN_RUNNING_UNPAUSED,
QEMU_ASYNC_JOB_NONE) < 0 && QEMU_ASYNC_JOB_NONE) < 0) {
virGetLastError() == NULL) { virDomainEventPtr event = NULL;
virReportError(VIR_ERR_OPERATION_FAILED, "%s", event = virDomainEventNewFromObj(vm,
_("resuming after drive-reopen failed")); VIR_DOMAIN_EVENT_SUSPENDED,
VIR_DOMAIN_EVENT_SUSPENDED_API_ERROR);
if (event)
qemuDomainEventQueue(driver, event);
if (virGetLastError() == NULL) {
virReportError(VIR_ERR_OPERATION_FAILED, "%s",
_("resuming after drive-reopen failed"));
}
} }
return ret; return ret;
} }