On Tue, Nov 25, 2008 at 11:39:57AM +0000, Daniel P. Berrange wrote: > Yeha, this is almost certainly just another example of XenD not properly > cleaning up / destroying domains. If you still have a machine which > shows this behaviour, then I'd recommend trying this change to our Xen > impl > > In xen_unified.c, find the method xenUnifiedListDomains and make it first > call xenStoreListDomains() and then fallback to trying HV & XenD drivers. > If we're lucky this will help.... Yes this helps indeed, thanks a lot. Possible patch attached. -- Guido
>From 215f2c99da9b086d8d506f359a1e4cfcc64670b6 Mon Sep 17 00:00:00 2001 From: =?utf-8?q?Guido=20G=C3=BCnther?= <agx@xxxxxxxxxxx> Date: Wed, 26 Nov 2008 10:54:51 +0100 Subject: [PATCH] prefer xenstore driver for listDomains at least Debian's xen 3.2.1 reports ghost ids of already shutdown domains when using the HV driver. --- src/proxy_internal.c | 3 +-- src/proxy_internal.h | 2 ++ src/xen_unified.c | 29 +++++++++++++++++++++++------ src/xend_internal.c | 2 +- src/xend_internal.h | 1 + 5 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/proxy_internal.c b/src/proxy_internal.c index 1378559..daf1193 100644 --- a/src/proxy_internal.c +++ b/src/proxy_internal.c @@ -37,7 +37,6 @@ static int xenProxyOpen(virConnectPtr conn, xmlURIPtr uri, virConnectAuthPtr aut static int xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer); static int xenProxyNodeGetInfo(virConnectPtr conn, virNodeInfoPtr info); static char *xenProxyGetCapabilities(virConnectPtr conn); -static int xenProxyListDomains(virConnectPtr conn, int *ids, int maxids); static int xenProxyNumOfDomains(virConnectPtr conn); static unsigned long xenProxyDomainGetMaxMemory(virDomainPtr domain); static int xenProxyDomainGetInfo(virDomainPtr domain, virDomainInfoPtr info); @@ -581,7 +580,7 @@ xenProxyGetVersion(virConnectPtr conn, unsigned long *hvVer) * * Returns the number of domain found or -1 in case of error */ -static int +int xenProxyListDomains(virConnectPtr conn, int *ids, int maxids) { virProxyPacket req; diff --git a/src/proxy_internal.h b/src/proxy_internal.h index 0e66c1c..693b10b 100644 --- a/src/proxy_internal.h +++ b/src/proxy_internal.h @@ -94,4 +94,6 @@ extern virDomainPtr xenProxyLookupByName(virConnectPtr conn, extern char * xenProxyDomainDumpXML(virDomainPtr domain, int flags); +extern int xenProxyListDomains(virConnectPtr conn, int *ids, + int maxids); #endif /* __LIBVIR_PROXY_H__ */ diff --git a/src/xen_unified.c b/src/xen_unified.c index 5807391..0fb5d73 100644 --- a/src/xen_unified.c +++ b/src/xen_unified.c @@ -485,14 +485,31 @@ static int xenUnifiedListDomains (virConnectPtr conn, int *ids, int maxids) { GET_PRIVATE(conn); - int i, ret; + int ret; - for (i = 0; i < XEN_UNIFIED_NR_DRIVERS; ++i) - if (priv->opened[i] && drivers[i]->listDomains) { - ret = drivers[i]->listDomains (conn, ids, maxids); - if (ret >= 0) return ret; - } + /* Try xenstore. */ + if (priv->opened[XEN_UNIFIED_XS_OFFSET]) { + ret = xenStoreListDomains (conn, ids, maxids); + if (ret >= 0) return ret; + } + /* Try HV. */ + if (priv->opened[XEN_UNIFIED_HYPERVISOR_OFFSET]) { + ret = xenHypervisorListDomains (conn, ids, maxids); + if (ret >= 0) return ret; + } + + /* Try xend. */ + if (priv->opened[XEN_UNIFIED_XEND_OFFSET]) { + ret = xenDaemonListDomains (conn, ids, maxids); + if (ret >= 0) return ret; + } + + /* Try proxy. */ + if (priv->opened[XEN_UNIFIED_PROXY_OFFSET]) { + ret = xenProxyListDomains (conn, ids, maxids); + if (ret >= 0) return ret; + } return -1; } diff --git a/src/xend_internal.c b/src/xend_internal.c index 2e1a8d1..9f1ad42 100644 --- a/src/xend_internal.c +++ b/src/xend_internal.c @@ -3455,7 +3455,7 @@ xenDaemonGetVersion(virConnectPtr conn, unsigned long *hvVer) * * Returns the number of domain found or -1 in case of error */ -static int +int xenDaemonListDomains(virConnectPtr conn, int *ids, int maxids) { struct sexpr *root = NULL; diff --git a/src/xend_internal.h b/src/xend_internal.h index 12fa379..af90290 100644 --- a/src/xend_internal.h +++ b/src/xend_internal.h @@ -178,5 +178,6 @@ int xenDaemonDomainMigratePrepare (virConnectPtr dconn, char **cookie, int *cook int xenDaemonDomainMigratePerform (virDomainPtr domain, const char *cookie, int cookielen, const char *uri, unsigned long flags, const char *dname, unsigned long resource); int xenDaemonDomainBlockPeek (virDomainPtr domain, const char *path, unsigned long long offset, size_t size, void *buffer); +int xenDaemonListDomains(virConnectPtr conn, int *ids, int maxids); #endif /* __XEND_INTERNAL_H_ */ -- 1.6.0.2
-- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list