* 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,
}
+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,
.domainMigrationPass = qemuProcessHandleMigrationPass,
.domainAcpiOstInfo = qemuProcessHandleAcpiOstInfo,
.domainBlockThreshold = qemuProcessHandleBlockThreshold,
+ .domainDumpCompleted = qemuProcessHandleDumpCompleted,
};
static void