[Libvir] RFC: PATCH 2/5: public & driver API for async jobs

Richard W.M. Jones rjones at redhat.com
Mon Jan 14 11:09:03 UTC 2008


Daniel P. Berrange wrote:
> This patch adds the public API for the virJobPtr object, and the
> internal driver support code. The new public APIs are:
> 
>  - int virJobGetInfo(virJobPtr job, virJobInfoPtr info);
> 
>    This gets elapsed time, estimate completion time, completion
>    progress percentage, and completion status - success, failed,
>    cancelled.
> 
>  - virDomainPtr  virJobGetDomain(virJobPtr job);
> 
>    If the job was a domain creation attempt, this gets the
>    resulting domain object
> 
>  - virNetworkPtr virJobGetNetwork(virJobPtr job);
> 
>    If the job was a network creation attempt, this gets the
>    resulting network object
> 
>  - virErrorPtr   virJobGetNetwork(virJobPtr job);
> 
>    If the job failed, this gets the associated error
> 
>  - int virJobCancel(virJobPtr job);
> 
>    Request that the job be cancelled. This is not an immediate
>    operation. It merely sets a flag, which background jobs will
>    check periodically. So a job may still complete even if it
>    was cancelled. It should be responded to within a few seconds
>    though.
> 
>  - int virJobDestroy(virJobPtr job);
> 
>    Once a job has finished running (success, failed, or cancelled)
>    this may be called to release all resources associated with
>    the job.
> 
> 
> As mentioned before, the following variants on existing APis are
> added:
> 
>  - virDomainCreateLinuxJob
>  - virDomainCreateJob
>  - virNetworkCreateJob
>  - virNetworkCreateXMLJob
>  - virDomainSaveJob
>  - virDomainRestoreJob
>  - virDomainDumpCoreJob
> 
> All are no-ops by default, unless the underlying driver supports
> async jobs.
> 
> 
> Finally, the job.c and job.h files provides a set of internal
> routines to authors for the purpose of managing virJobPtr objects.
> There is a default impl of the virJobDriver APIs which should be
> suitable for all existing the remote driver. The async jobs are
> basically run in a background pthread.
> 
> This psuedo code illustrates how the 'test' driver might use
> these to implement an asynchronous variant of the 'save' method.
> It basically stores the parameters in a struct, and then calls
> the virJobCreate() method.
> 
>     privdata = malloc(sizeof(*privdata));
>     if (privdata == NULL)
>         return (NULL);
>     memset(privdata, 0, sizeof(*privdata));
> 
>     privdata->type = TEST_JOB_DOMAIN_SAVE;
>     privdata->data.save.domidx = domidx;
>     privdata->data.save.path = strdup(path);
> 
>     job = virJobCreate(domain->conn,
>                        domain->conn->driver->jobDriver,
>                        testDomainSaveWorker,
>                        NULL,
>                        privdata,
>                        VIR_JOB_BOUNDED);
> 
> 
> The actual work is done in the 'testDomainSaveWorker' method
> which is passed in to virJobCreate. The job.h file contains
> APIs for it to call to update progress information and detect
> cancellation:
> 
>   static void testDomainSaveWorker(virJobPtr job, void *data)
>   {
>       testJobPtr privdata = data;
>       /* A 50 second ETA for saving */
>       virJobInitialize(job, 50);
> 
>       do {
>           ... do a unit of work...
> 
>           ... Check for cancellation ...
>           if (virJobFinishCancel(job))
>               return;
> 
>           ... update progress, indicating 1 second
>               of work complete, remove 1 second from
>               the ETA, and add 2% of completion state...
>           virJobUpdateRel(job, 1, -1, 2);
>       } while (...not done...);
> 
>       ... Inform world we're all done ...
>       virJobFinishSuccess(job);
>   }
> 
> The virJobInitialize, virJobFinishCancel, virJobFinishSuccess
> and virJobUpdateRel methods all take care to lock the virJobPtr
> object to ensure thread safety.

This API looks sensible.

I haven't checked the code in detail - I'll follow your Storage API 
repository instead.

Rich.

-- 
Emerging Technologies, Red Hat - http://et.redhat.com/~rjones/
Registered Address: Red Hat UK Ltd, Amberley Place, 107-111 Peascod
Street, Windsor, Berkshire, SL4 1TE, United Kingdom.  Registered in
England and Wales under Company Registration No. 03798903
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/x-pkcs7-signature
Size: 3237 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20080114/b81abd5e/attachment-0001.bin>


More information about the libvir-list mailing list