[libvirt] [PATCH 2/2] qemu: Check for job being set when getting iothread stats

Jonathon Jongsma jjongsma at redhat.com
Fri Nov 8 15:05:53 UTC 2019


On Fri, 2019-11-08 at 10:44 +0100, Michal Privoznik wrote:
> On 11/7/19 6:29 PM, Jonathon Jongsma wrote:
> > On Thu, 2019-11-07 at 14:19 +0100, Michal Privoznik wrote:
> > > The qemuDomainGetStatsIOThread() accesses the monitor by calling
> > > qemuDomainGetIOThreadsMon(). And it's also marked as "need
> > > monitor" in qemuDomainGetStatsWorkers[]. However, it's not
> > > checking if acquiring job was successful.
> > > 
> > > Signed-off-by: Michal Privoznik <mprivozn at redhat.com>
> > > ---
> > >   src/qemu/qemu_driver.c | 4 ++--
> > >   1 file changed, 2 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > > index d17c18705b..146b4ee319 100644
> > > --- a/src/qemu/qemu_driver.c
> > > +++ b/src/qemu/qemu_driver.c
> > > @@ -21194,7 +21194,7 @@ static int
> > >   qemuDomainGetStatsIOThread(virQEMUDriverPtr driver,
> > >                              virDomainObjPtr dom,
> > >                              virTypedParamListPtr params,
> > > -                           unsigned int privflags G_GNUC_UNUSED)
> > > +                           unsigned int privflags)
> > >   {
> > >       qemuDomainObjPrivatePtr priv = dom->privateData;
> > >       size_t i;
> > > @@ -21202,7 +21202,7 @@
> > > qemuDomainGetStatsIOThread(virQEMUDriverPtr
> > > driver,
> > >       int niothreads;
> > >       int ret = -1;
> > >   
> > > -    if (!virDomainObjIsActive(dom))
> > > +    if (!HAVE_JOB(privflags) || !virDomainObjIsActive(dom))
> > >           return 0;
> > 
> > It seems to me that not having acquired a job would be an error
> > condition. Here you return 0 indicating that the query was
> > successful.
> > 
> > Also, although this change doesn't really harm anything, it doesn't
> > quite seem like the proper fix to me. You're essentially calling a
> > function that requires a job, and passing it a flag indicating
> > whether
> > we've acquired a job or not. That's a bit of an odd pattern; a flag
> > parameter indicating whether the function should actually execute
> > or
> > not:
> > 
> >    void do_something(bool yes_i_really_mean_it)
> > 
> > :) It seems like the proper fix would be to simply not call the
> > function if we haven't acquired a job.
> > 
> > Of course, you could still keep the above patch if you want to be
> > cautious, but perhaps the real fix should be to filter out monitor-
> > requiring jobs in qemuDomainGetStats() when we failed to acquire a
> > job? Something like:
> > 
> > diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
> > index 42922d2f04..a935ef6d97 100644
> > --- a/src/qemu/qemu_driver.c
> > +++ b/src/qemu/qemu_driver.c
> > @@ -21456,7 +21456,10 @@ qemuDomainGetStats(virConnectPtr conn,
> >           return -1;
> >   
> >       for (i = 0; qemuDomainGetStatsWorkers[i].func; i++) {
> > -        if (stats & qemuDomainGetStatsWorkers[i].stats) {
> > +        if (stats & qemuDomainGetStatsWorkers[i].stats &&
> > +            (!qemuDomainGetStatsWorkers[i].monitor ||
> > HAVE_JOB(flags))) {
> >               if (qemuDomainGetStatsWorkers[i].func(conn-
> > >privateData,
> > dom, params,
> >                                                     flags) < 0)
> >                   return -1;
> 
> These stats querying callbacks work in a different way than the rest
> of 
> the code. The entry point is qemuConnectGetAllDomainStats(). It
> iterates 
> over the list of domains and tries to acquire job for each domain
> that 
> it's currently iterating over. This may of course fail (or, if
> NOWAIT 
> flag is specified then user specifically requested to skip domains 
> "blocked" with a job). Anyway, there are some stats that require
> job, 
> some that don't, and some that are somewhere in the middle (e.g. 
> qemuDomainGetStatsVcpu), i.e. they can get some basic info and if job
> is 
> acquired they can gather even more info. Therefore, we can't check
> for 
> HAVE_JOB() in qemuDomainGetStats() but rather in each callback
> individually.

Aha, I had missed the part where some functions can get a reduced set
of stats despite having .monitor=true. Sorry for that.

It still seems a bit of an odd pattern to me. In some ways, I think it
would be cleaner to change the qemuDomainGetStatsWorker.monitor
variable from a boolean to an enumeration that can be one of
MONITOR_NONE, MONITOR_OPTIONAL, MONITOR_REQUIRED, so we have enough
information to decide whether to call the function or not. 

But this patch is consistent with the others, so

Reviewed-by: Jonathon Jongsma <jjongsma at redhat.com>


> 
> As for returning success, the virConnectGetAllDomainStats() API is 
> document as:
> 
> Note that entire stats groups or individual stat fields may be
> missing 
> from the output in case they are not supported by the given
> hypervisor, 
> are not applicable for the current state of the guest domain, or
> their 
> retrieval was not successful.
> 
> The way I read this is: if unable to acquire job, omit iothread
> stats 
> without reporting error. In fact, this is what other callbacks do
> too.
> 
> Michal




More information about the libvir-list mailing list