[libvirt] RFC New virDomainBlockPull API family to libvirt
Adam Litke
agl at us.ibm.com
Thu Jul 14 18:50:40 UTC 2011
On 07/14/2011 04:21 AM, Jiri Denemark 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? Also I think it would be nice to
> make the virDomainBlockPullInfo more similar to virDomainJobInfo. I was
> thinking about something along the following lines:
We've already discussed using a JobInfo-like structure in the past but
the fields are not really appropriate for this operation. The number of
blocks remaining is not available via the qemu API and it is a
non-deterministic value that depends on other guest IO that is ongoing.
> typedef struct _virDomainBlockJobInfo virDomainBlockJobInfo;
> struct _virDomainBlockJobInfo {
> int job; /* BLOCK_PULL, BLOCK_COPY, ... */
> int status; /* COMPLETED, FAILED, CANCELLED */
> unsigned long long timeElapsed;
> unsigned long long total;
> unsigned long long processed;
> unsigned long long remaining;
> }
>
> int virDomainBlockJobAbort(virDomainPtr dom,
> const char *path,
> unsigned int flags);
>
> int virDomainGetBlockJobInfo(virDomainPtr dom,
> const char *path,
> virDomainBlockJobInfoPtr info,
> unsigned int flags);
>
> typedef void (*virConnectDomainEventBlockJobCallback)(virConnectPtr conn,
> virDomainPtr dom,
> const char *path,
> int job,
> int status);
>
> I doubt it's practical to support more than one block operation on a single
> disk at a time, since that sounds to me like asking for troubles and data
> corruption. But if someone thinks we should keep the door open for this, we
> can add 'job' parameter to Abort and Info APIs.
I don't think we should be supporting multiple block operations at once.
--
Adam Litke
IBM Linux Technology Center
More information about the libvir-list
mailing list