提交 3455a735 编写于 作者: J John Ferlan

qemu: Introduce qemuProcessHandleDumpCompleted

Handle a DUMP_COMPLETED event processing the status, stats, and
error string. Use the @status in order to copy the error that
was generated whilst processing the @stats data. If an error was
provided by QEMU, then use that instead.

If there's no async job, we can just ignore the data.
Reviewed-by: NJiri Denemark <jdenemar@redhat.com>
上级 fd1a9e5c
......@@ -334,6 +334,8 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
job->spiceMigration = false;
job->spiceMigrated = false;
job->postcopyEnabled = false;
job->dumpCompleted = false;
VIR_FREE(job->error);
VIR_FREE(job->current);
}
......
......@@ -175,6 +175,8 @@ struct qemuDomainJobObj {
* should wait for it to finish */
bool spiceMigrated; /* spice migration completed */
bool postcopyEnabled; /* post-copy migration was enabled */
char *error; /* job event completion error */
bool dumpCompleted; /* dump completed */
};
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
......
......@@ -1677,6 +1677,45 @@ qemuProcessHandleMigrationPass(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
}
static int
qemuProcessHandleDumpCompleted(qemuMonitorPtr mon ATTRIBUTE_UNUSED,
virDomainObjPtr vm,
int status,
qemuMonitorDumpStatsPtr stats,
const char *error,
void *opaque ATTRIBUTE_UNUSED)
{
qemuDomainObjPrivatePtr priv;
virObjectLock(vm);
VIR_DEBUG("Dump completed for domain %p %s with stats=%p error='%s'",
vm, vm->def->name, stats, NULLSTR(error));
priv = vm->privateData;
if (priv->job.asyncJob == QEMU_ASYNC_JOB_NONE) {
VIR_DEBUG("got DUMP_COMPLETED event without a dump_completed job");
goto cleanup;
}
priv->job.dumpCompleted = true;
priv->job.current->stats.dump = *stats;
ignore_value(VIR_STRDUP_QUIET(priv->job.error, error));
/* Force error if extracting the DUMP_COMPLETED status failed */
if (!error && status < 0) {
ignore_value(VIR_STRDUP_QUIET(priv->job.error, virGetLastErrorMessage()));
priv->job.current->stats.dump.status = QEMU_MONITOR_DUMP_STATUS_FAILED;
}
virDomainObjBroadcast(vm);
cleanup:
virResetLastError();
virObjectUnlock(vm);
return 0;
}
static qemuMonitorCallbacks monitorCallbacks = {
.eofNotify = qemuProcessHandleMonitorEOF,
.errorNotify = qemuProcessHandleMonitorError,
......@@ -1705,6 +1744,7 @@ static qemuMonitorCallbacks monitorCallbacks = {
.domainMigrationPass = qemuProcessHandleMigrationPass,
.domainAcpiOstInfo = qemuProcessHandleAcpiOstInfo,
.domainBlockThreshold = qemuProcessHandleBlockThreshold,
.domainDumpCompleted = qemuProcessHandleDumpCompleted,
};
static void
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册