提交 8c466583 编写于 作者: N Nikolay Shirokovskiy 提交者: Jiri Denemark

qemu: migrate: add mirror stats to migration stats

When getting job info in case mirror does not reach ready phase
fetch mirror stats from qemu. Otherwise mirror stats are already
saved in current job.
Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
上级 defc8790
...@@ -448,9 +448,13 @@ qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo, ...@@ -448,9 +448,13 @@ qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
info->memRemaining = jobInfo->stats.ram_remaining; info->memRemaining = jobInfo->stats.ram_remaining;
info->memProcessed = jobInfo->stats.ram_transferred; info->memProcessed = jobInfo->stats.ram_transferred;
info->fileTotal = jobInfo->stats.disk_total; info->fileTotal = jobInfo->stats.disk_total +
info->fileRemaining = jobInfo->stats.disk_remaining; jobInfo->mirrorStats.total;
info->fileProcessed = jobInfo->stats.disk_transferred; info->fileRemaining = jobInfo->stats.disk_remaining +
(jobInfo->mirrorStats.total -
jobInfo->mirrorStats.transferred);
info->fileProcessed = jobInfo->stats.disk_transferred +
jobInfo->mirrorStats.transferred;
info->dataTotal = info->memTotal + info->fileTotal; info->dataTotal = info->memTotal + info->fileTotal;
info->dataRemaining = info->memRemaining + info->fileRemaining; info->dataRemaining = info->memRemaining + info->fileRemaining;
...@@ -466,9 +470,12 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo, ...@@ -466,9 +470,12 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
int *nparams) int *nparams)
{ {
qemuMonitorMigrationStats *stats = &jobInfo->stats; qemuMonitorMigrationStats *stats = &jobInfo->stats;
qemuDomainMirrorStatsPtr mirrorStats = &jobInfo->mirrorStats;
virTypedParameterPtr par = NULL; virTypedParameterPtr par = NULL;
int maxpar = 0; int maxpar = 0;
int npar = 0; int npar = 0;
unsigned long long mirrorRemaining = mirrorStats->total -
mirrorStats->transferred;
if (virTypedParamsAddInt(&par, &npar, &maxpar, if (virTypedParamsAddInt(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_OPERATION, VIR_DOMAIN_JOB_OPERATION,
...@@ -510,15 +517,18 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo, ...@@ -510,15 +517,18 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
if (virTypedParamsAddULLong(&par, &npar, &maxpar, if (virTypedParamsAddULLong(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_DATA_TOTAL, VIR_DOMAIN_JOB_DATA_TOTAL,
stats->ram_total + stats->ram_total +
stats->disk_total) < 0 || stats->disk_total +
mirrorStats->total) < 0 ||
virTypedParamsAddULLong(&par, &npar, &maxpar, virTypedParamsAddULLong(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_DATA_PROCESSED, VIR_DOMAIN_JOB_DATA_PROCESSED,
stats->ram_transferred + stats->ram_transferred +
stats->disk_transferred) < 0 || stats->disk_transferred +
mirrorStats->transferred) < 0 ||
virTypedParamsAddULLong(&par, &npar, &maxpar, virTypedParamsAddULLong(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_DATA_REMAINING, VIR_DOMAIN_JOB_DATA_REMAINING,
stats->ram_remaining + stats->ram_remaining +
stats->disk_remaining) < 0) stats->disk_remaining +
mirrorRemaining) < 0)
goto error; goto error;
if (virTypedParamsAddULLong(&par, &npar, &maxpar, if (virTypedParamsAddULLong(&par, &npar, &maxpar,
...@@ -561,13 +571,16 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo, ...@@ -561,13 +571,16 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
if (virTypedParamsAddULLong(&par, &npar, &maxpar, if (virTypedParamsAddULLong(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_DISK_TOTAL, VIR_DOMAIN_JOB_DISK_TOTAL,
stats->disk_total) < 0 || stats->disk_total +
mirrorStats->total) < 0 ||
virTypedParamsAddULLong(&par, &npar, &maxpar, virTypedParamsAddULLong(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_DISK_PROCESSED, VIR_DOMAIN_JOB_DISK_PROCESSED,
stats->disk_transferred) < 0 || stats->disk_transferred +
mirrorStats->transferred) < 0 ||
virTypedParamsAddULLong(&par, &npar, &maxpar, virTypedParamsAddULLong(&par, &npar, &maxpar,
VIR_DOMAIN_JOB_DISK_REMAINING, VIR_DOMAIN_JOB_DISK_REMAINING,
stats->disk_remaining) < 0) stats->disk_remaining +
mirrorRemaining) < 0)
goto error; goto error;
if (stats->disk_bps && if (stats->disk_bps &&
......
...@@ -109,6 +109,14 @@ typedef enum { ...@@ -109,6 +109,14 @@ typedef enum {
QEMU_DOMAIN_JOB_STATUS_CANCELED, QEMU_DOMAIN_JOB_STATUS_CANCELED,
} qemuDomainJobStatus; } qemuDomainJobStatus;
typedef struct _qemuDomainMirrorStats qemuDomainMirrorStats;
typedef qemuDomainMirrorStats *qemuDomainMirrorStatsPtr;
struct _qemuDomainMirrorStats {
unsigned long long transferred;
unsigned long long total;
};
typedef struct _qemuDomainJobInfo qemuDomainJobInfo; typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr; typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo { struct _qemuDomainJobInfo {
...@@ -130,6 +138,7 @@ struct _qemuDomainJobInfo { ...@@ -130,6 +138,7 @@ struct _qemuDomainJobInfo {
bool timeDeltaSet; bool timeDeltaSet;
/* Raw values from QEMU */ /* Raw values from QEMU */
qemuMonitorMigrationStats stats; qemuMonitorMigrationStats stats;
qemuDomainMirrorStats mirrorStats;
}; };
struct qemuDomainJobObj { struct qemuDomainJobObj {
......
...@@ -13016,6 +13016,11 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver, ...@@ -13016,6 +13016,11 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
qemuMigrationFetchStats(driver, vm, QEMU_ASYNC_JOB_NONE, jobInfo) < 0) qemuMigrationFetchStats(driver, vm, QEMU_ASYNC_JOB_NONE, jobInfo) < 0)
goto cleanup; goto cleanup;
if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE &&
qemuMigrationFetchMirrorStats(driver, vm, QEMU_ASYNC_JOB_NONE,
jobInfo) < 0)
goto cleanup;
if (qemuDomainJobInfoUpdateTime(jobInfo) < 0) if (qemuDomainJobInfoUpdateTime(jobInfo) < 0)
goto cleanup; goto cleanup;
} }
......
...@@ -983,6 +983,9 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver, ...@@ -983,6 +983,9 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
goto cleanup; goto cleanup;
} }
qemuMigrationFetchMirrorStats(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
priv->job.current);
/* Okay, all disks are ready. Modify migrate_flags */ /* Okay, all disks are ready. Modify migrate_flags */
*migrate_flags &= ~(QEMU_MONITOR_MIGRATE_NON_SHARED_DISK | *migrate_flags &= ~(QEMU_MONITOR_MIGRATE_NON_SHARED_DISK |
QEMU_MONITOR_MIGRATE_NON_SHARED_INC); QEMU_MONITOR_MIGRATE_NON_SHARED_INC);
...@@ -5918,3 +5921,54 @@ qemuMigrationReset(virQEMUDriverPtr driver, ...@@ -5918,3 +5921,54 @@ qemuMigrationReset(virQEMUDriverPtr driver,
virFreeError(err); virFreeError(err);
} }
} }
int
qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
qemuDomainJobInfoPtr jobInfo)
{
size_t i;
qemuDomainObjPrivatePtr priv = vm->privateData;
bool nbd = false;
virHashTablePtr blockinfo = NULL;
qemuDomainMirrorStatsPtr stats = &jobInfo->mirrorStats;
for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i];
if (QEMU_DOMAIN_DISK_PRIVATE(disk)->migrating) {
nbd = true;
break;
}
}
if (!nbd)
return 0;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
blockinfo = qemuMonitorGetAllBlockJobInfo(priv->mon);
if (qemuDomainObjExitMonitor(driver, vm) < 0 || !blockinfo)
return -1;
memset(stats, 0, sizeof(*stats));
for (i = 0; i < vm->def->ndisks; i++) {
virDomainDiskDefPtr disk = vm->def->disks[i];
qemuDomainDiskPrivatePtr diskPriv = QEMU_DOMAIN_DISK_PRIVATE(disk);
qemuMonitorBlockJobInfoPtr data;
if (!diskPriv->migrating ||
!(data = virHashLookup(blockinfo, disk->info.alias)))
continue;
stats->transferred += data->cur;
stats->total += data->end;
}
virHashFree(blockinfo);
return 0;
}
...@@ -319,4 +319,10 @@ qemuMigrationReset(virQEMUDriverPtr driver, ...@@ -319,4 +319,10 @@ qemuMigrationReset(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
qemuDomainAsyncJob job); qemuDomainAsyncJob job);
int
qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuDomainAsyncJob asyncJob,
qemuDomainJobInfoPtr jobInfo);
#endif /* __QEMU_MIGRATION_H__ */ #endif /* __QEMU_MIGRATION_H__ */
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册