[libvirt] [PATCHv2 1/9] lib: Add public api to enable atomic listing of guest

Eric Blake eblake at redhat.com
Tue Jun 5 17:39:24 UTC 2012


On 06/05/2012 07:19 AM, Peter Krempa wrote:
> This patch adds a new public api that lists domains. The new approach is
> different from those used before. There are key points to this:
> 
> 1) The list is acquired atomically and contains both active and inactive
> domains (guests). This eliminates the need to call two different list
> APIs, where the state might change in between of the calls.

s/between of/between/

> 
> 2) The returned list consists of virDomainPtrs instead of names or ID's
> that have to be converted to virDomainPtrs anyways using separate calls
> for each one of them. This is more convenient and saves hypervisor calls.
> 
> 3) The returned list is auto-allocated. This saves a lot hassle for the

s/lot/lot of/

> users.
> 
> 4) Built in support for filtering. The API call supports various
> filtering flags that modify the output list according to user needs.
> 
> Available filter groups:
>     Domain status:
>     VIR_CONNECT_LIST_DOMAINS_ACTIVE, VIR_CONNECT_LIST_DOMAINS_INACTIVE
> 
>     Domain persistence:
>     VIR_CONNECT_LIST_DOMAINS_PERSISTENT,
>     VIR_CONNECT_LIST_DOMAINS_TRANSIENT
> 
>     Domain state:
>     VIR_CONNECT_LIST_DOMAINS_RUNNING, VIR_CONNECT_LIST_DOMAINS_PAUSED,
>     VIR_CONNECT_LIST_DOMAINS_SHUTOFF, VIR_CONNECT_LIST_DOMAINS_OTHER
> 
>     Presense of managed save image:

s/Presense/Presence/

>     VIR_CONNECT_LIST_DOMAINS_MANAGEDSAVE,
>     VIR_CONNECT_LIST_DOMAINS_NO_MANAGEDSAVE
> 
>     Auto-start option:
>     VIR_CONNECT_LIST_DOMAINS_AUTOSTART,
>     VIR_CONNECT_LIST_DOMAINS_NO_AUTOSTART
> 
>     Presense of snapshot:

s/Presense/Presence/

>     VIR_CONNECT_LIST_DOMAINS_HAS_SNAPSHOT,
>     VIR_CONNECT_LIST_DOMAINS_NO_SNAPSHOT
> 
> 5) The python binding returns a list of domain objects that is very neat
> to work with.
> 
> The only problem with this approach is no support from code generators
> so both RPC code and python bindings had to be written manualy.

s/manualy/manually/

> 
> *include/libvirt/libvirt.h.in: - add API prototype
>                                - clean up whitespace mistakes nearby
> *python/generator.py: - inhibit generation of the bindings for the new
>                         api
> *src/driver.h: - add driver prototype
>                - clean up some whitespace mistakes nearby
> *src/libvirt.c: - add public implementation
> *src/libvirt_public.syms: - export the new symbol
> ---
> Diff to v1:
> - added docs and filtering flags
> ---
>  include/libvirt/libvirt.h.in |   36 ++++++++++++-
>  python/generator.py          |    1 +
>  src/driver.h                 |   11 +++-
>  src/libvirt.c                |  122 +++++++++++++++++++++++++++++++++++++++++-
>  src/libvirt_public.syms      |    5 ++
>  5 files changed, 168 insertions(+), 7 deletions(-)


> @@ -866,6 +870,7 @@ struct _virDriver {
>      virDrvGetCapabilities		getCapabilities;
>      virDrvListDomains		listDomains;
>      virDrvNumOfDomains		numOfDomains;
> +    virDrvListAllDomains    listAllDomains;

Spacing looks inconsistent here.  (Hmm, changing things to use space
instead of tab would be a separate commit.)

> 
>  /**
> + * virConnectListAllDomains:
> + * @conn: Pointer to the hypervisor connection.
> + * @domains: Pointer to a variable to store the array containing domain objects
> + *           or NULL if the list is not required (just returns number of guests).
> + * @flags: bitwise-OR of virConnectListAllDomainsFlags
> + *
> + * Collect a possibly-filtered list of all domains, and return an allocated
> + * array of information for each.  This API solves the race inherent in
> + * virConnectListDomains() and virConnectListDefinedDomains().
> + *
> + * Normally, all domains are returned; however, @flags can be used to
> + * filter the results for a smaller list of targetted domains.  The valid

s/targetted/targeted/

> + *
> + * Returns the number of domains found or -1 in case of error.  On success,
> + * the array stored into @doms is guaranteed to have an extra allocated
> + * element set to NULL, to make iteration easier.

Maybe:

s/an extra allocated element set to NULL/& but not included in the
return count/

to make it obvious that the trailing NULL does not impact the return value.

> + *
> + * Example of usage:
> + * virDomainPtr *domains;
> + * virDomainPtr dom;
> + * int i;
> + *

I'd drop this blank line.

> + * int ret;
> + * unsigned int flags = VIR_CONNECT_LIST_RUNNING |
> + *                      VIR_CONNECT_LIST_PERSISTENT;
> + *
> + * ret = virConnectListAllDomains(conn, &domains, flags);
> + * if (ret < 0)
> + *     error();
> + *
> + * for (i = 0; i < ret; i++) {
> + *      do_someting_with_domain(domains[i]);

s/someting/something/


> +{
> +    VIR_DEBUG("conn=%p, domains=%p, flags=%x", conn, domains, flags);
> +
> +    virResetLastError();
> +
> +    if (!VIR_IS_CONNECT(conn)) {
> +        virLibConnError(VIR_ERR_INVALID_CONN, __FUNCTION__);
> +        virDispatchError(NULL);
> +        return -1;
> +    }

There's now a conflict between your commit and danpb's cleanups to error
reporting in libvirt.c - whoever commits second should make sure to
rebase properly.

ACK with doc tweaks included.

-- 
Eric Blake   eblake at redhat.com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20120605/d32397c6/attachment-0001.sig>


More information about the libvir-list mailing list