[PATCH 1/4] test_driver: Implement virDomainGetJobInfo

Luke Yue lukedyue at gmail.com
Wed Aug 11 14:32:17 UTC 2021


On Wed, 2021-08-11 at 15:11 +0200, Martin Kletzander wrote:
> On Wed, Aug 11, 2021 at 08:31:03PM +0800, Luke Yue wrote:
> > On Tue, 2021-08-10 at 17:49 +0200, Martin Kletzander wrote:
> > > On Thu, Jul 22, 2021 at 03:13:22PM +0800, Luke Yue wrote:
> > > > As in testDomainGetControlInfo, a background job should be
> > > > running
> > > > between 0-10000 seconds, so make the testDomainGetJobInfo
> > > > consistent
> > > > with it.
> > > > 
> > > > Signed-off-by: Luke Yue <lukedyue at gmail.com>
> > > > ---
> > > > src/test/test_driver.c | 51
> > > > ++++++++++++++++++++++++++++++++++++++++++
> > > > 1 file changed, 51 insertions(+)
> > > > 
> > > > diff --git a/src/test/test_driver.c b/src/test/test_driver.c
> > > > index 892dc978f2..29b19d80f0 100644
> > > > --- a/src/test/test_driver.c
> > > > +++ b/src/test/test_driver.c
> > > > @@ -2604,6 +2604,56 @@ testDomainGetOSType(virDomainPtr dom
> > > > G_GNUC_UNUSED)
> > > >     return ret;
> > > > }
> > > > 
> > > > +static int
> > > > +testDomainGetJobInfoImpl(virDomainObj *dom,
> > > > +                         virDomainJobInfoPtr info)
> > > > +{
> > > > +    testDomainObjPrivate *priv = dom->privateData;
> > > > +
> > > > +    memset(info, 0, sizeof(*info));
> > > > +
> > > > +    if (priv->seconds < 10000) {
> > > > +        info->type = VIR_DOMAIN_JOB_BOUNDED;
> > > > +        info->dataTotal = 10000;
> > > > +        info->dataProcessed = priv->seconds;
> > > > +        info->dataRemaining = 10000 - priv->seconds;
> > > > +        info->timeElapsed = priv->seconds;
> > > > +        info->timeRemaining = 10000 - priv->seconds;
> > > > +        info->memTotal = 1048576;
> > > > +        info->memProcessed = 1048576 - priv->seconds;
> > > > +        info->memRemaining = priv->seconds;
> > > > +        info->fileTotal = 2097152;
> > > > +        info->fileProcessed = 2097152 - priv->seconds;
> > > > +        info->fileRemaining = priv->seconds;
> > > > +    } else if (priv->seconds < 30000 && priv->seconds >=
> > > > 10000) {
> > > > +        info->type = VIR_DOMAIN_JOB_COMPLETED;
> > > > +    } else {
> > > > +        info->type = VIR_DOMAIN_JOB_NONE;
> > > > +    }
> > > > +
> > > 
> > > So this is an interesting approach.  However because we are not
> > > doing
> > > different setups for different domains (all possible ones use the
> > > same
> > > PrivateAlloc function) we cannot test much here.  But then when
> > > you
> > > think about changing the domain time for some domains it (even by
> > > just
> > > using virDomainSetTime API) the job output is very much non-
> > > intuitive.
> > > So I would rather prefer some extra struct member(s) to keep
> > > track of
> > > the job info.  It can then be nicely used for testing
> > > domainGetJobInfo
> > > with flags as well as aborting and starting jobs in a more
> > > interested
> > > and I think useful way.
> > > 
> > > Other than that this series looks fine.
> > 
> > Thanks for the review! So if I understand you correctly, we have to
> > add
> > struct member(s) such as
> > 
> >  unsigned int jobType;
> > 
> > to testDomainObjPrivate to store the job info rather than using
> > time.
> 
> Yes, if you want you can even use more members if there's a use for
> them.
> 
> > We can change it to VIR_DOMAIN_BLOCK_JOB_CANCELED when we use
> > virDomainAbortJob, and change it to other values when the APIs
> > should
> > start a job, such as virDomainBackupBegin (not implement yet
> > though).
> > 
> 
> Yes, and starting any jobs is not needed right now.  But it is way
> clearer to see what the code does when testDomainAbortJob() does:
> 
>    priv->jobState = VIR_DOMAIN_JOB_CANCELLED
> 
> compared to:
> 
>    priv->seconds = 10000
> 
> and it is also easier to review because it is easy to gloss over the
> fact that priv->seconds == 10000 does not mean CANCELLED, but
> COMPLETED.  Essentially more readable data structures make it easier
> to
> spot errors.
> 
> > But I am a little bit puzzling about testing the domainGetJobInfo
> > with
> > flags, the virDomainGetJobInfo currently don't have flags as
> > parameter,
> > do we have to add one? Or do I misunderstand something?
> > 
> 
> Sorry, I meant JobStats, there you can get info for completed jobs
> and
> so on.  Those are not that important for the test driver, but once
> the
> backend is implemented they should be trivial to adapt.
> 

Thanks, I think I got your points now, I will try to implement them in
v2.

> > Thanks,
> > Luke
> > 
> > > 
> > > > +    return 0;
> > > > +}
> > > > +
> > > > +static int
> > > > +testDomainGetJobInfo(virDomainPtr dom,
> > > > +                     virDomainJobInfoPtr info)
> > > > +{
> > > > +    virDomainObj *vm;
> > > > +    int ret = -1;
> > > > +
> > > > +    if (!(vm = testDomObjFromDomain(dom)))
> > > > +        goto cleanup;
> > > > +
> > > > +    if (virDomainObjCheckActive(vm) < 0)
> > > > +        goto cleanup;
> > > > +
> > > > +    ret = testDomainGetJobInfoImpl(vm, info);
> > > > +
> > > > + cleanup:
> > > > +    virDomainObjEndAPI(&vm);
> > > > +    return ret;
> > > > +}
> > > > +
> > > > 
> > > > static int
> > > > testDomainGetLaunchSecurityInfo(virDomainPtr domain
> > > > G_GNUC_UNUSED,
> > > > @@ -9484,6 +9534,7 @@ static virHypervisorDriver
> > > > testHypervisorDriver = {
> > > >     .domainMemoryPeek = testDomainMemoryPeek, /* 5.4.0 */
> > > >     .domainGetBlockInfo = testDomainGetBlockInfo, /* 5.7.0 */
> > > >     .domainSetLifecycleAction = testDomainSetLifecycleAction,
> > > > /*
> > > > 5.7.0 */
> > > > +    .domainGetJobInfo = testDomainGetJobInfo, /* 7.6.0 */
> > > > 
> > > >     .domainSnapshotNum = testDomainSnapshotNum, /* 1.1.4 */
> > > >     .domainSnapshotListNames = testDomainSnapshotListNames, /*
> > > > 1.1.4 */
> > > > --
> > > > 2.32.0
> > > > 
> > 





More information about the libvir-list mailing list