[libvirt] RFE: virConnectListAllDomains()

Peter Krempa pkrempa at redhat.com
Sun May 20 15:20:36 UTC 2012


On 05/19/2012 01:52 AM, Eric Blake wrote:
> Use of virConnectListDomains() and virConnectListDefinedDomains() is:
>
> 1. inherently racy.  A domain can change between active and inactive
> between two back-to-back calls, and thus be entirely skipped or
> enumerated twice when concatenating lists.
>
> 2. painful to use.  ListDomains gives ids, ListDefinedDomains gives
> names, and the user must then call virDomainLookupByID() and
> virDomainLookupByName() to convert into UUIDs.
>
> 3. requires pre-allocation.  The user must call virConnectNumOfDomains()
> then over-allocate before calling virConnectListDomains(), in order to
> guarantee that the list size didn't change between the two calls.
>
> This is a proposal for a new API that addresses all three points - by
> returning virDomainPtr rather than id or strings, the UUID of each
> domain can be grabbed in one shot.  By consolidating things into a
> single API call, there is no race in trying to piece together the
> complete list.  By having libvirt allocate the resulting array, rather
> than making the caller pre-allocate, the user doesn't have to worry
> about a race between getting a count and using that count.  It also
> provides the convenience of returning smaller lists based on various
> filtering groups.
>
> Thoughts before I expand this API and add the actual implementation?

I definitely agree with all of your points. I had very similar ideas how 
to implement such a functionality that actualy resulted in a very 
similar functionality that I've got almost ready and implemented (I was 
struggling with python bindings for this as I didn't notice that some of 
the code for looking up domains was automaticaly generated). Therefore 
I'd be glad if you would comment on my implementation and save work 
yourself :)

>
> diff --git i/include/libvirt/libvirt.h.in w/include/libvirt/libvirt.h.in
> index a817db8..ea63d9f 100644
> --- i/include/libvirt/libvirt.h.in
> +++ w/include/libvirt/libvirt.h.in
> @@ -1192,6 +1192,38 @@ int                     virConnectListDomains
> (virConnectPtr conn,
>    */
>   int                     virConnectNumOfDomains  (virConnectPtr conn);
>
> +/**
> + * virConnectListAllDomainsFlags:
> + *
> + * Flags used to tune which domains are listed by
> virConnectListAllDomains().
> + * Note that these flags come in groups; if all bits from a group are 0,
> + * then that group is not used to filter results.
> + */
> +typedef enum {
> +    VIR_CONNECT_LIST_DOMAINS_ACTIVE         = 1<<  0,
> +    VIR_CONNECT_LIST_DOMAINS_INACTIVE       = 1<<  1,
> +
> +    VIR_CONNECT_LIST_DOMAINS_PERSISTENT     = 1<<  2,
> +    VIR_CONNECT_LIST_DOMAINS_TRANSIENT      = 1<<  3,
> +
> +    VIR_CONNECT_LIST_DOMAINS_RUNNING        = 1<<  4,
> +    VIR_CONNECT_LIST_DOMAINS_PAUSED         = 1<<  5,
> +    VIR_CONNECT_LIST_DOMAINS_SHUTOFF        = 1<<  6,
> +    VIR_CONNECT_LIST_DOMAINS_OTHER          = 1<<  7,
> +
> +    VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE    = 1<<  8,
> +    VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE = 1<<  9,
> +
> +    VIR_CONNECT_LIST_DOMAINS_AUTOSTART      = 1<<  10,
> +    VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART   = 1<<  11,
> +
> +    VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT   = 1<<  12,
> +    VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT    = 1<<  13,
> +} virConnectListAllDomainsFlags;

This collection of filters is impressive, I'll add them as a followup or 
in v2 as v1 is almost ready.

> +
> +int                     virConnectListAllDomains(virConnectPtr conn,
> +                                                 virDomainPtr *doms,
> +                                                 unsigned int flags);

My take of implementing this was basicaly identical (even the function 
name). The only thing i took differently was adding a parameter 
"ndomains" to enable limiting of size of the returned array. I don't 
think that this will be widely used, but it might be useful to get some 
of the guests if the complete list exceeds RPC limit. Do you think I 
should keep it?

Peter




More information about the libvir-list mailing list