[libvirt] [PATCH v3 REBASE 12/16] qemu: migrate: show disks stats on job info requests

Nikolay Shirokovskiy posted 16 patches 7 years, 8 months ago
There is a newer version of this series
[libvirt] [PATCH v3 REBASE 12/16] qemu: migrate: show disks stats on job info requests
Posted by Nikolay Shirokovskiy 7 years, 8 months ago
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

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 REBASE 12/16] qemu: migrate: show disks stats on job info requests
Posted by Jiri Denemark 7 years, 8 months ago
On Thu, Aug 24, 2017 at 09:56:49 +0300, Nikolay Shirokovskiy wrote:
> 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.
...
> 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;

You should not touch qemuMonitorMigrationStatsPtr here. The scructure is
used to store raw data from query_migrate QMP command. Just add another
structure to jobInfo for storing NBD migration statistics. If you do
this, you don't need the hack to conditionally clear
qemuMonitorMigrationStats. Both structs can be combined in
qemuDomainJobInfoTo*.

Jirka

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH v3 REBASE 12/16] qemu: migrate: show disks stats on job info requests
Posted by Nikolay Shirokovskiy 7 years, 8 months ago

On 29.08.2017 18:20, Jiri Denemark wrote:
> On Thu, Aug 24, 2017 at 09:56:49 +0300, Nikolay Shirokovskiy wrote:
>> 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.
> ...
>> 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;
> 
> You should not touch qemuMonitorMigrationStatsPtr here. The scructure is
> used to store raw data from query_migrate QMP command. Just add another
> structure to jobInfo for storing NBD migration statistics. If you do
> this, you don't need the hack to conditionally clear
> qemuMonitorMigrationStats. Both structs can be combined in
> qemuDomainJobInfoTo*.

Yep, this simple change makes that quite ugly hack unnessesary. Great!

> 
> Jirka
> 

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list