[libvirt] [PATCH 1/2] Fix logic in xenUnifiedNumOfDomains to match xenUnifiedListDomains

Daniel Veillard veillard at redhat.com
Fri Oct 9 11:06:14 UTC 2009


On Fri, Oct 09, 2009 at 10:35:48AM +0100, Daniel P. Berrange wrote:
> From: Jonas Eriksson <jonas.j.eriksson at ericsson.com>
> 
> The xenUnifiedNumOfDomains and xenUnifiedListDomains methods work
> together as a pair, so it is critical they both apply the same
> logic. With the current mis-matched logic it is possible to sometimes
> get into a state when you miss certain active guests.
> 
> * src/xen/xen_driver.c: Change xenUnifiedNumOfDomains ordering to
>   match xenUnifiedListDomains.
> ---
>  src/xen/proxy_internal.c |    3 +--
>  src/xen/proxy_internal.h |    1 +
>  src/xen/xen_driver.c     |   30 ++++++++++++++++++++++++------
>  src/xen/xend_internal.c  |    2 +-
>  src/xen/xend_internal.h  |    1 +
>  5 files changed, 28 insertions(+), 9 deletions(-)
> 
> diff --git a/src/xen/proxy_internal.c b/src/xen/proxy_internal.c
> index f9d2fad..22ff172 100644
> --- a/src/xen/proxy_internal.c
> +++ b/src/xen/proxy_internal.c
> @@ -40,7 +40,6 @@ static virDrvOpenStatus xenProxyOpen(virConnectPtr conn, virConnectAuthPtr auth,
>  static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer);
>  static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info);
>  static char *xenProxyGetCapabilities(virConnectPtr conn);
> -static int xenProxyNumOfDomains(virConnectPtr conn);
>  static unsigned long xenProxyDomainGetMaxMemory(virDomainPtr domain);
>  static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info);
>  static char *xenProxyDomainGetOSType(virDomainPtr domain);
> @@ -607,7 +606,7 @@ xenProxyListDomains(virConnectPtr conn, int *ids, int maxids)
>   *
>   * Returns the number of domain found or -1 in case of error
>   */
> -static int
> +int
>  xenProxyNumOfDomains(virConnectPtr conn)
>  {
>      virProxyPacket req;
> diff --git a/src/xen/proxy_internal.h b/src/xen/proxy_internal.h
> index 185fa67..19df751 100644
> --- a/src/xen/proxy_internal.h
> +++ b/src/xen/proxy_internal.h
> @@ -96,4 +96,5 @@ extern char *       xenProxyDomainDumpXML(virDomainPtr domain,
>                                            int flags);
>  extern int          xenProxyListDomains(virConnectPtr conn, int *ids,
>                                          int maxids);
> +extern int xenProxyNumOfDomains(virConnectPtr conn);
>  #endif /* __LIBVIR_PROXY_H__ */
> diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c
> index 76b896a..fc8bbe6 100644
> --- a/src/xen/xen_driver.c
> +++ b/src/xen/xen_driver.c
> @@ -576,13 +576,31 @@ static int
>  xenUnifiedNumOfDomains (virConnectPtr conn)
>  {
>      GET_PRIVATE(conn);
> -    int i, ret;
> +    int ret;
>  
> -    for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i)
> -        if (priv->opened[i] && drivers[i]->numOfDomains) {
> -            ret = drivers[i]->numOfDomains (conn);
> -            if (ret >= 0) return ret;
> -        }
> +    /* Try xenstore. */
> +    if (priv->opened[XEN_UNIFIED_XS_OFFSET]) {
> +        ret = xenStoreNumOfDomains (conn);
> +        if (ret >= 0) return ret;
> +    }
> +
> +    /* Try HV. */
> +    if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) {
> +        ret = xenHypervisorNumOfDomains (conn);
> +        if (ret >= 0) return ret;
> +    }
> +
> +    /* Try xend. */
> +    if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) {
> +        ret = xenDaemonNumOfDomains (conn);
> +        if (ret >= 0) return ret;
> +    }
> +
> +    /* Try proxy. */
> +    if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) {
> +        ret = xenProxyNumOfDomains (conn);
> +        if (ret >= 0) return ret;
> +    }
>  
>      return -1;
>  }
> diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c
> index 49bdba9..f362ae6 100644
> --- a/src/xen/xend_internal.c
> +++ b/src/xen/xend_internal.c
> @@ -3685,7 +3685,7 @@ error:
>   *
>   * Returns the number of domain found or -1 in case of error
>   */
> -static int
> +int
>  xenDaemonNumOfDomains(virConnectPtr conn)
>  {
>      struct sexpr *root = NULL;
> diff --git a/src/xen/xend_internal.h b/src/xen/xend_internal.h
> index 9d2571b..8b00737 100644
> --- a/src/xen/xend_internal.h
> +++ b/src/xen/xend_internal.h
> @@ -187,5 +187,6 @@ int xenDaemonDomainMigratePerform (virDomainPtr domain, const char *cookie, int
>  
>  int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer);
>  int xenDaemonListDomains(virConnectPtr conn, int *ids, int maxids);
> +int xenDaemonNumOfDomains(virConnectPtr conn);
>  
>  #endif /* __XEND_INTERNAL_H_ */

  ACK !

Daniel

-- 
Daniel Veillard      | libxml Gnome XML XSLT toolkit  http://xmlsoft.org/
daniel at veillard.com  | Rpmfind RPM search engine http://rpmfind.net/
http://veillard.com/ | virtualization library  http://libvirt.org/




More information about the libvir-list mailing list