This patch shows incorrect info when client request comes
when migration routine is stopping mirror jobs or mirror
jobs already stopped. This issue will be addressed in next
patch.
---
src/qemu/qemu_driver.c | 4 ++++
src/qemu/qemu_migration.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_migration.h | 6 ++++++
3 files changed, 59 insertions(+)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 20ae879..d012fd0 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -12948,6 +12948,10 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
&jobInfo->stats, false) < 0)
goto cleanup;
+ if (qemuMigrationFetchMirrorStats(driver, vm, QEMU_ASYNC_JOB_NONE,
+ &jobInfo->stats) < 0)
+ goto cleanup;
+
if (qemuDomainJobInfoUpdateTime(jobInfo) < 0)
goto cleanup;
}
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 2a8a721..c7af1ac 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -5922,3 +5922,52 @@ qemuMigrationReset(virQEMUDriverPtr driver,
virFreeError(err);
}
}
+
+
+int
+qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
+ qemuMonitorMigrationStatsPtr stats)
+{
+ size_t i;
+ qemuDomainObjPrivatePtr priv = vm->privateData;
+ bool nbd = false;
+ virHashTablePtr blockinfo = NULL;
+
+ 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;
+
+ 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->disk_transferred += data->cur;
+ stats->disk_total += data->end;
+ stats->disk_remaining += data->end - data->cur;
+ }
+
+ virHashFree(blockinfo);
+ return 0;
+}
diff --git a/src/qemu/qemu_migration.h b/src/qemu/qemu_migration.h
index 1f6ddba..13cfe47 100644
--- a/src/qemu/qemu_migration.h
+++ b/src/qemu/qemu_migration.h
@@ -320,4 +320,10 @@ qemuMigrationReset(virQEMUDriverPtr driver,
virDomainObjPtr vm,
qemuDomainAsyncJob job);
+int
+qemuMigrationFetchMirrorStats(virQEMUDriverPtr driver,
+ virDomainObjPtr vm,
+ qemuDomainAsyncJob asyncJob,
+ qemuMonitorMigrationStatsPtr stats);
+
#endif /* __QEMU_MIGRATION_H__ */
--
1.8.3.1