return 0;
}
- jobInfo->stats.downtime = now - jobInfo->stopped;
- jobInfo->stats.downtime_set = true;
+ jobInfo->stats.mig.downtime = now - jobInfo->stopped;
+ jobInfo->stats.mig.downtime_set = true;
return 0;
}
info->type = qemuDomainJobStatusToType(jobInfo->status);
info->timeElapsed = jobInfo->timeElapsed;
- info->memTotal = jobInfo->stats.ram_total;
- info->memRemaining = jobInfo->stats.ram_remaining;
- info->memProcessed = jobInfo->stats.ram_transferred;
+ switch (jobInfo->statsType) {
+ case QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION:
+ info->memTotal = jobInfo->stats.mig.ram_total;
+ info->memRemaining = jobInfo->stats.mig.ram_remaining;
+ info->memProcessed = jobInfo->stats.mig.ram_transferred;
+ info->fileTotal = jobInfo->stats.mig.disk_total +
+ jobInfo->mirrorStats.total;
+ info->fileRemaining = jobInfo->stats.mig.disk_remaining +
+ (jobInfo->mirrorStats.total -
+ jobInfo->mirrorStats.transferred);
+ info->fileProcessed = jobInfo->stats.mig.disk_transferred +
+ jobInfo->mirrorStats.transferred;
+ break;
- info->fileTotal = jobInfo->stats.disk_total +
- jobInfo->mirrorStats.total;
- info->fileRemaining = jobInfo->stats.disk_remaining +
- (jobInfo->mirrorStats.total -
- jobInfo->mirrorStats.transferred);
- info->fileProcessed = jobInfo->stats.disk_transferred +
- jobInfo->mirrorStats.transferred;
+ case QEMU_DOMAIN_JOB_STATS_TYPE_NONE:
+ break;
+ }
info->dataTotal = info->memTotal + info->fileTotal;
info->dataRemaining = info->memRemaining + info->fileRemaining;
return 0;
}
-int
-qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
- int *type,
- virTypedParameterPtr *params,
- int *nparams)
+
+static int
+qemuDomainMigrationJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
+ int *type,
+ virTypedParameterPtr *params,
+ int *nparams)
{
- qemuMonitorMigrationStats *stats = &jobInfo->stats;
+ qemuMonitorMigrationStats *stats = &jobInfo->stats.mig;
qemuDomainMirrorStatsPtr mirrorStats = &jobInfo->mirrorStats;
virTypedParameterPtr par = NULL;
int maxpar = 0;
}
+int
+qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
+ int *type,
+ virTypedParameterPtr *params,
+ int *nparams)
+{
+ switch (jobInfo->statsType) {
+ case QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION:
+ return qemuDomainMigrationJobInfoToParams(jobInfo, type, params, nparams);
+
+ case QEMU_DOMAIN_JOB_STATS_TYPE_NONE:
+ break;
+ }
+
+ return -1;
+}
+
+
/* qemuDomainGetMasterKeyFilePath:
* @libDir: Directory path to domain lib files
*
QEMU_DOMAIN_JOB_STATUS_CANCELED,
} qemuDomainJobStatus;
+typedef enum {
+ QEMU_DOMAIN_JOB_STATS_TYPE_NONE = 0,
+ QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION,
+} qemuDomainJobStatsType;
+
typedef struct _qemuDomainMirrorStats qemuDomainMirrorStats;
typedef qemuDomainMirrorStats *qemuDomainMirrorStatsPtr;
destination. */
bool timeDeltaSet;
/* Raw values from QEMU */
- qemuMonitorMigrationStats stats;
+ qemuDomainJobStatsType statsType;
+ union {
+ qemuMonitorMigrationStats mig;
+ } stats;
qemuDomainMirrorStats mirrorStats;
};
goto endjob;
}
+ priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION;
+
/* Pause */
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
was_running = true;
goto endjob;
}
+ priv = vm->privateData;
+ priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION;
+
/* Migrate will always stop the VM, so the resume condition is
independent of whether the stop command is issued. */
resume = virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING;
} else if (((resume && paused) || (flags & VIR_DUMP_RESET)) &&
virDomainObjIsActive(vm)) {
if ((ret == 0) && (flags & VIR_DUMP_RESET)) {
- priv = vm->privateData;
qemuDomainObjEnterMonitor(driver, vm);
ret = qemuMonitorSystemReset(priv->mon);
if (qemuDomainObjExitMonitor(driver, vm) < 0)
}
*jobInfo = *priv->job.current;
- if (qemuDomainGetJobInfoMigrationStats(driver, vm, jobInfo) < 0)
- goto cleanup;
+ switch (jobInfo->statsType) {
+ case QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION:
+ if (qemuDomainGetJobInfoMigrationStats(driver, vm, jobInfo) < 0)
+ goto cleanup;
+ break;
+
+ case QEMU_DOMAIN_JOB_STATS_TYPE_NONE:
+ break;
+ }
ret = 0;
static void
qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
{
- switch ((qemuMonitorMigrationStatus) jobInfo->stats.status) {
+ switch ((qemuMonitorMigrationStatus) jobInfo->stats.mig.status) {
case QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY:
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_POSTCOPY;
break;
if (qemuDomainObjExitMonitor(driver, vm) < 0 || rv < 0)
return -1;
- jobInfo->stats = stats;
+ jobInfo->stats.mig = stats;
return 0;
}
int ret = -1;
if (!events ||
- jobInfo->stats.status == QEMU_MONITOR_MIGRATION_STATUS_ERROR) {
+ jobInfo->stats.mig.status == QEMU_MONITOR_MIGRATION_STATUS_ERROR) {
if (qemuMigrationFetchStats(driver, vm, asyncJob, jobInfo, &error) < 0)
return -1;
}
qemuDomainJobInfoUpdateTime(jobInfo);
jobInfo->timeDeltaSet = mig->jobInfo->timeDeltaSet;
jobInfo->timeDelta = mig->jobInfo->timeDelta;
- jobInfo->stats.downtime_set = mig->jobInfo->stats.downtime_set;
- jobInfo->stats.downtime = mig->jobInfo->stats.downtime;
+ jobInfo->stats.mig.downtime_set = mig->jobInfo->stats.mig.downtime_set;
+ jobInfo->stats.mig.downtime = mig->jobInfo->stats.mig.downtime;
}
if (flags & VIR_MIGRATE_OFFLINE)
virDomainObjPtr vm,
qemuDomainAsyncJob job)
{
+ qemuDomainObjPrivatePtr priv = vm->privateData;
virDomainJobOperation op;
unsigned long long mask;
if (qemuDomainObjBeginAsyncJob(driver, vm, job, op) < 0)
return -1;
+ priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION;
+
qemuDomainObjSetAsyncJobMask(vm, mask);
return 0;
}
qemuMigrationCookieStatisticsXMLFormat(virBufferPtr buf,
qemuDomainJobInfoPtr jobInfo)
{
- qemuMonitorMigrationStats *stats = &jobInfo->stats;
+ qemuMonitorMigrationStats *stats = &jobInfo->stats.mig;
virBufferAddLit(buf, "<statistics>\n");
virBufferAdjustIndent(buf, 2);
if (VIR_ALLOC(jobInfo) < 0)
goto cleanup;
- stats = &jobInfo->stats;
+ stats = &jobInfo->stats.mig;
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
virXPathULongLong("string(./started[1])", ctxt, &jobInfo->started);
goto cleanup;
}
- priv->job.current->stats.status = status;
+ priv->job.current->stats.mig.status = status;
virDomainObjBroadcast(vm);
cleanup: