[PATCH 1/3] qemu_monitor: add qemuMonitorQueryStats

Martin Kletzander mkletzan at redhat.com
Fri Jul 22 15:02:06 UTC 2022


On Fri, Jul 22, 2022 at 02:44:30PM +0200, Kristina Hanicova wrote:
>On Thu, Jul 14, 2022 at 7:54 AM Amneesh Singh <natto at weirdnatto.in> wrote:
>
>> Related: https://gitlab.com/libvirt/libvirt/-/issues/276
>>
>> This patch adds an API for the "query-stats" QMP command.
>>
>> The query returns a JSON containing the statistics based on the target,
>> which can either be vCPU or VM, and the providers. The API deserializes
>> the query result into an array of GHashMaps, which can later be used to
>> extract all the query statistics. GHashMaps are used to avoid traversing
>> the entire array to find the statistics you are looking for. This would
>> be a singleton array if the target is a VM since the returned JSON is
>> also a singleton array in that case.
>>
>> Signed-off-by: Amneesh Singh <natto at weirdnatto.in>
>> ---
>>  src/qemu/qemu_monitor.c      |  70 +++++++++++++++++++
>>  src/qemu/qemu_monitor.h      |  45 ++++++++++++
>>  src/qemu/qemu_monitor_json.c | 130 +++++++++++++++++++++++++++++++++++
>>  src/qemu/qemu_monitor_json.h |   6 ++
>>  4 files changed, 251 insertions(+)
>>
>> diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c
>> index fda5d2f3..a07e6017 100644
>> --- a/src/qemu/qemu_monitor.c
>> +++ b/src/qemu/qemu_monitor.c
>> @@ -4541,3 +4541,73 @@ qemuMonitorMigrateRecover(qemuMonitor *mon,
>>
>>      return qemuMonitorJSONMigrateRecover(mon, uri);
>>  }
>> +
>> +VIR_ENUM_IMPL(qemuMonitorQueryStatsTarget,
>> +              QEMU_MONITOR_QUERY_STATS_TARGET_LAST,
>> +              "vm",
>> +              "vcpu",
>> +);
>> +
>> +VIR_ENUM_IMPL(qemuMonitorQueryStatsName,
>> +              QEMU_MONITOR_QUERY_STATS_NAME_LAST,
>> +              "halt_poll_success_ns",
>> +              "halt_poll_fail_ns"
>> +);
>> +
>> +VIR_ENUM_IMPL(qemuMonitorQueryStatsProvider,
>> +              QEMU_MONITOR_QUERY_STATS_PROVIDER_LAST,
>> +              "kvm",
>> +);
>> +
>> +void
>> +qemuMonitorQueryStatsProviderFree(qemuMonitorQueryStatsProvider *provider)
>> +{
>> +    virBitmapFree(provider->names);
>> +    g_free(provider);
>> +}
>> +
>> +qemuMonitorQueryStatsProvider *
>> +qemuMonitorQueryStatsProviderNew(qemuMonitorQueryStatsProviderType
>> provider_type,
>> +                                 ...)
>> +{
>> +    g_autoptr(qemuMonitorQueryStatsProvider) provider = NULL;
>> +    qemuMonitorQueryStatsNameType stat;
>> +    va_list name_list;
>> +    size_t sentinel = QEMU_MONITOR_QUERY_STATS_NAME_LAST;
>> +
>> +    provider = g_new0(qemuMonitorQueryStatsProvider, 1);
>> +    provider->provider = provider_type;
>> +    provider->names = NULL;
>> +
>> +    va_start(name_list, provider_type);
>> +    stat = va_arg(name_list, qemuMonitorQueryStatsNameType);
>> +
>> +    if (stat != sentinel) {
>>
>
>It would be better to compare 'stat' with QEMU_MONITOR_QUERY_STATS_NAME_LAST
>directly without the additional variable 'sentinel'.
>
>
>> +        provider->names =
>> virBitmapNew(QEMU_MONITOR_QUERY_STATS_NAME_LAST);
>> +
>> +        while (stat != sentinel) {
>>
>
>Same here.
>
>
>This while cycle would be better outside the if case, such as:
>
>if (stat != sentinel)
>    provider->names = virBitmapNew(QEMU_MONITOR_QUERY_STATS_NAME_LAST);
>
>while (stat != sentinel) {
>    ....
>}
>
>Because the 'while' cycle has the same condition as the 'if' case.
>
>
>> +            if (virBitmapSetBit(provider->names, stat) < 0)
>> +                return NULL;
>> +            stat = va_arg(name_list, qemuMonitorQueryStatsNameType);
>> +        }
>> +    }
>> +    va_end(name_list);
>> +
>> +    return g_steal_pointer(&provider);
>> +}

Sorry for so many review e-mails from me on this one patch, but while fixing few
of the nitpicks I managed to rewrite the function quite a bit:

     qemuMonitorQueryStatsProvider *provider = g_new0(qemuMonitorQueryStatsProvider, 1);
     qemuMonitorQueryStatsNameType stat;
     va_list name_list;

     /*
      * This can be lowered later in case of the enum getting quite large, hence
      *  the virBitmapSetExpand below.
      */
     provider->names = virBitmapNew(QEMU_MONITOR_QUERY_STATS_NAME_LAST);
     provider->type = provider_type;

     va_start(name_list, provider_type);

     while ((stat = va_arg(name_list, qemuMonitorQueryStatsNameType)) !=
            QEMU_MONITOR_QUERY_STATS_NAME_LAST)
         virBitmapSetBitExpand(provider->names, stat);

     va_end(name_list);

     return provider;

Let me know (both of you) if you are okay with me using this version.

Thanks
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20220722/c3cb0ea5/attachment-0001.sig>


More information about the libvir-list mailing list