[libvirt] RFC New virDomainBlockPull API family to libvirt

Stefan Hajnoczi stefanha at gmail.com
Thu Jul 14 10:33:18 UTC 2011


On Thu, Jul 14, 2011 at 11:19 AM, Jiri Denemark <jdenemar at redhat.com> wrote:
> On Thu, Jul 14, 2011 at 10:58:31 +0100, Stefan Hajnoczi wrote:
>> On Thu, Jul 14, 2011 at 10:21 AM, Jiri Denemark <jdenemar at redhat.com> wrote:
>> > On Wed, Jul 13, 2011 at 15:46:30 -0500, Adam Litke wrote:
>> > ...
>> >> /*
>> >>  * BlockPull API
>> >>  */
>> >>
>> >> /* An iterator for initiating and monitoring block pull operations */
>> >> typedef unsigned long long virDomainBlockPullCursor;
>> >>
>> >> typedef struct _virDomainBlockPullInfo virDomainBlockPullInfo;
>> >> struct _virDomainBlockPullInfo {
>> >>     /*
>> >>      * The following fields provide an indication of block pull progress.  @cur
>> >>      * indicates the current position and will be between 0 and @end.  @end is
>> >>      * the final cursor position for this operation and represents completion.
>> >>      * To approximate progress, divide @cur by @end.
>> >>      */
>> >>     virDomainBlockPullCursor cur;
>> >>     virDomainBlockPullCursor end;
>> >> };
>> >> typedef virDomainBlockPullInfo *virDomainBlockPullInfoPtr;
>> > ...
>> >> /**
>> >>  * virDomainBlockPullAbort:
>> >>  * @dom: pointer to domain object
>> >>  * @path: fully-qualified filename of disk
>> >>  * @flags: currently unused, for future extension
>> >>  *
>> >>  * Cancel a pull operation previously started by virDomainBlockPullAll().
>> >>  *
>> >>  * Returns -1 in case of failure, 0 when successful.
>> >>  */
>> >> int                 virDomainBlockPullAbort(virDomainPtr dom,
>> >>                                             const char *path,
>> >>                                             unsigned int flags);
>> >>
>> >> /**
>> >>  * virDomainGetBlockPullInfo:
>> >>  * @dom: pointer to domain object
>> >>  * @path: fully-qualified filename of disk
>> >>  * @info: pointer to a virDomainBlockPullInfo structure
>> >>  * @flags: currently unused, for future extension
>> >>  *
>> >>  * Request progress information on a block pull operation that has been started
>> >>  * with virDomainBlockPull().  If an operation is active for the given
>> >>  * parameters, @info will be updated with the current progress.
>> >>  *
>> >>  * Returns -1 in case of failure, 0 when successful.
>> >>  */
>> >> int                 virDomainGetBlockPullInfo(virDomainPtr dom,
>> >>                                               const char *path,
>> >>                                               virDomainBlockPullInfoPtr info,
>> >>                                               unsigned int flags);
>> >>
>> >> /**
>> >>  * virConnectDomainEventBlockPullStatus:
>> >>  *
>> >>  * The final status of a virDomainBlockPull() operation
>> >>  */
>> >> typedef enum {
>> >>     VIR_DOMAIN_BLOCK_PULL_COMPLETED = 0,
>> >>     VIR_DOMAIN_BLOCK_PULL_FAILED = 1,
>> >> } virConnectDomainEventBlockPullStatus;
>> >>
>> >> /**
>> >>  * virConnectDomainEventBlockPullCallback:
>> >>  * @conn: connection object
>> >>  * @dom: domain on which the event occurred
>> >>  * @path: fully-qualified filename of the affected disk
>> >>  * @status: final status of the operation (virConnectDomainEventBlockPullStatus
>> >>  *
>> >>  * The callback signature to use when registering for an event of type
>> >>  * VIR_DOMAIN_EVENT_ID_BLOCK_PULL with virConnectDomainEventRegisterAny()
>> >>  */
>> >> typedef void (*virConnectDomainEventBlockPullCallback)(virConnectPtr conn,
>> >>                                                        virDomainPtr dom,
>> >>                                                        const char *path,
>> >>                                                        int status,
>> >>                                                        void *opaque);
>> >
>> > Could these managing functions and event callback become general and usable by
>> > other block operations such as block copy?
>>
>> Hi Jiri,
>> Live block copy will certainly be possible using the streaming API.
>> Before you start streaming you need to use the snapshot_blkdev command
>> to create the destination file with the source file as its backing
>> image.  You can then use the streaming API to copy data from the
>> source file into the destination file.  On completion the source file
>> is no longer needed.
>
> Well, I'm not talking about using the same API for block copy or implementing
> block copy internally as block streaming. I'm talking about making GetInfo,
> Abort and event callback general to be usable not only for block streaming or
> block copy but also for other possible block operations in the future.
>
> The reason is that starting a block operation (streaming, copy, whatever) may
> need different parameters so they should be different APIs. But once the
> operation is started, we just need to know how far it got and we need the
> ability to abort the job. So this can share the same APIs for all operations.
> It doesn't make sense to require any block operation to provide their own set
> of managing APIs.
>
> It's analogous to virDomainSave, virDomainMigrate, virDomainCoreDump. They are
> all different jobs but all of them can be monitored and aborted using
> virDomainGetJobInfo and virDomainAbortJob.

I understand.  I can't comment on libvirt API specifics but yes,
there's a similarity here and a chance we'll have other operations in
the future too.

I'm thinking things like compacting images, compressing images, etc.

Stefan




More information about the libvir-list mailing list