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

Nikolay Shirokovskiy nshirokovskiy at virtuozzo.com
Wed Aug 30 08:34:56 UTC 2017



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
> 




More information about the libvir-list mailing list