[PATCH v2 09/11] test_driver: Implement virConnectGetAllDomainStats

Luke Yue lukedyue at gmail.com
Wed Aug 11 14:48:13 UTC 2021


On Wed, 2021-08-11 at 15:23 +0200, Martin Kletzander wrote:
> On Thu, Jul 29, 2021 at 08:10:56PM +0800, Luke Yue wrote:
> > Implement virConnectGetAllDomainStats in a modular way just like
> > QEMU
> > driver, though remove some params in GetStatsWorker that we don't
> > need
> > in test driver currently.
> > 
> > Only add the worker to get state so far, more worker will be added
> > in the future.
> > 
> 
> Sorry for not getting to this earlier.  I did not review the series
> yet,
> but there were some conflicts when applying and the patches did not
> compile for me, so I figured I'll let you know at least.
> 
> > Signed-off-by: Luke Yue <lukedyue at gmail.com>
> > ---
> > src/test/test_driver.c | 132
> > +++++++++++++++++++++++++++++++++++++++++
> > 1 file changed, 132 insertions(+)
> > 
> > diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> > index ca36e655f4..5da7f23a9b 100644
> > --- a/src/test/test_driver.c
> > +++ b/src/test/test_driver.c
> 
> [...]
> 
> > +static int
> > +testConnectGetAllDomainStats(virConnectPtr conn,
> > +                             virDomainPtr *doms,
> > +                             unsigned int ndoms,
> > +                             unsigned int stats,
> > +                             virDomainStatsRecordPtr **retStats,
> > +                             unsigned int flags)
> > +{
> > +    testDriver *driver = conn->privateData;
> > +    unsigned int lflags = flags &
> > (VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
> > +                                  
> > VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
> > +                                  
> > VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE);
> > +
> > +    unsigned int supported = VIR_DOMAIN_STATS_STATE;
> > +    virDomainObj **vms = NULL;
> > +    size_t nvms;
> > +    virDomainStatsRecordPtr *tmpstats = NULL;
> > +    int nstats = 0;
> > +    int ret = -1;
> > +    size_t i;
> > +
> > +    virCheckFlags(VIR_CONNECT_LIST_DOMAINS_FILTERS_ACTIVE |
> > +                  VIR_CONNECT_LIST_DOMAINS_FILTERS_PERSISTENT |
> > +                  VIR_CONNECT_LIST_DOMAINS_FILTERS_STATE |
> > +                  VIR_CONNECT_GET_ALL_DOMAINS_STATS_NOWAIT |
> > +                  VIR_CONNECT_GET_ALL_DOMAINS_STATS_BACKING |
> > +                  VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS,
> > -1);
> > +
> > +    if (!stats) {
> > +        stats = supported;
> > +    } else if ((flags &
> > VIR_CONNECT_GET_ALL_DOMAINS_STATS_ENFORCE_STATS) &&
> > +               (stats & ~supported)) {
> > +        virReportError(VIR_ERR_ARGUMENT_UNSUPPORTED,
> > +                       _("Stats types bits 0x%x are not supported
> > by this daemon"),
> > +                       stats & ~supported);
> > +        return -1;
> > +    }
> > +
> > +    if (ndoms) {
> > +        if (virDomainObjListConvert(driver->domains, conn, doms,
> > ndoms, &vms,
> > +                                    &nvms, NULL, lflags, true) <
> > 0)
> > +            return -1;
> > +    } else {
> > +        if (virDomainObjListCollect(driver->domains, conn, &vms,
> > &nvms,
> > +                                    NULL, lflags) < 0)
> > +            return -1;
> > +    }
> > +
> > +    tmpstats = g_new0(virDomainStatsRecordPtr, nvms + 1);
> > +
> > +    for (i = 0; i < nvms; i++) {
> > +        virDomainStatsRecordPtr tmp;
> > +        virDomainObj *vm = vms[i];
> > +
> > +        virObjectLock(vm);
> > +        testDomainGetStats(conn, vm, stats, &tmp);
> 
> This function can fail and there is no way of knowing without
> checking
> the error code.  It might look like it is fine because &tmp will be
> NULL, but the function does not clear it and you did not initialise
> it
> here.  Initialisation to sensible defaults is almost always good,
> even
> if you just override it later on.
> 
> > +        virObjectUnlock(vm);
> > +
> > +        if (!tmp)
> > +            goto cleanup;
> > +
> > +        tmpstats[nstats++] = tmp;
> 
> And due to above reasons I get this here:
> 
> ../src/test/test_driver.c: In function
> ‘testConnectGetAllDomainStats’:
> ../src/test/test_driver.c:9952:28: error: ‘tmp’ may be used
> uninitialized in this function [-Werror=maybe-uninitialized]
>   9952 |         tmpstats[nstats++] = tmp;
>        |         ~~~~~~~~~~~~~~~~~~~^~~~~
> 
> I am compiling it with GCC 11.2.0.  But it should also fail in our
> CI,
> which would make life easier for you, so I suggest you set up a
> GitLab
> account and setup a CI for your branches there.  You might go the
> extra
> mile and set up cirrus testing as described somewhere under ci/, if
> you
> want.

Sorry for that, I will fix that and remember to initialise these in the
future. I just find out that when configured with `meson build -
Dbuildtype=debug`, it won't give this error message, but with `meson
build -Dbuildtype=release` will. I do have set up my GitLab account,
though sometimes I forgot to push my local branches to remote, I will
push them before I try to submit patches, so I can find out if the CI
passed or not.

> 
> I would suggest checking the return value _and_ initialising the
> pointer
> to NULL.  And I promise I'll have a look at the series ASAP if you
> rebase it to current master ;)
> 

Thanks, I will rebase the series and apply your suggestions in v3.

> Thanks,
> Martin





More information about the libvir-list mailing list