If libvirt was built against inotify, but an API user isn't using domain
events (virsh, virt-manager), the xen xm driver doesn't poll /etc/xen
for new config files. This means that domains created or deleted on
other libvirt connections aren't reflected in the original connection
(but they will show up for all newly opened connections). This causes
newly created VMs to disappear from virt-manager < 0.8.0 once they are
shutdown, since VMs were installed on a separate connection.
The attached patch refreshes /etc/xen in all cases, unless inotify was
successfully initialized (user is using domain events).
Thanks,
Cole
diff --git a/src/xm_internal.c b/src/xm_internal.c
index 9d021eb..c1188fe 100644
--- a/src/xm_internal.c
+++ b/src/xm_internal.c
@@ -122,6 +122,19 @@ struct xenUnifiedDriver xenXMDriver = {
virReportErrorHelper(conn, VIR_FROM_XENXM, code, __FILE__, \
__FUNCTION__, __LINE__, fmt)
+static int xenInotifyActive(virConnectPtr conn)
+{
+ int ret;
+#ifndef WITH_XEN_INOTIFY
+ ret = 0;
+#else
+ xenUnifiedPrivatePtr priv = (xenUnifiedPrivatePtr) conn->privateData;
+ ret = (priv->inotifyWatch > 0);
+#endif
+
+ return ret;
+}
+
/* Convenience method to grab a int from the config file object */
static int xenXMConfigGetBool(virConnectPtr conn,
virConfPtr conf,
@@ -1737,10 +1750,8 @@ virDomainPtr xenXMDomainLookupByName(virConnectPtr conn, const char *domname) {
priv = conn->privateData;
xenUnifiedLock(priv);
-#ifndef WITH_XEN_INOTIFY
- if (xenXMConfigCacheRefresh (conn) < 0)
+ if (!xenInotifyActive(conn) && xenXMConfigCacheRefresh (conn) < 0)
goto cleanup;
-#endif
if (!(filename = virHashLookup(priv->nameConfigMap, domname)))
goto cleanup;
@@ -1795,10 +1806,8 @@ virDomainPtr xenXMDomainLookupByUUID(virConnectPtr conn,
priv = conn->privateData;
xenUnifiedLock(priv);
-#ifndef WITH_XEN_INOTIFY
- if (xenXMConfigCacheRefresh (conn) < 0)
+ if (!xenInotifyActive(conn) && xenXMConfigCacheRefresh (conn) < 0)
goto cleanup;
-#endif
if (!(entry = virHashSearch(priv->configCache, xenXMDomainSearchForUUID, (const void *)uuid)))
goto cleanup;
@@ -2551,12 +2560,10 @@ virDomainPtr xenXMDomainDefineXML(virConnectPtr conn, const char *xml) {
xenUnifiedLock(priv);
-#ifndef WITH_XEN_INOTIFY
- if (xenXMConfigCacheRefresh (conn) < 0) {
+ if (!xenInotifyActive(conn) && xenXMConfigCacheRefresh (conn) < 0) {
xenUnifiedUnlock(priv);
return (NULL);
}
-#endif
if (!(def = virDomainDefParseString(conn, priv->caps, xml,
VIR_DOMAIN_XML_INACTIVE))) {
@@ -2741,10 +2748,8 @@ int xenXMListDefinedDomains(virConnectPtr conn, char **const names, int maxnames
priv = conn->privateData;
xenUnifiedLock(priv);
-#ifndef WITH_XEN_INOTIFY
- if (xenXMConfigCacheRefresh (conn) < 0)
+ if (!xenInotifyActive(conn) && xenXMConfigCacheRefresh (conn) < 0)
goto cleanup;
-#endif
if (maxnames > virHashSize(priv->configCache))
maxnames = virHashSize(priv->configCache);
@@ -2757,9 +2762,7 @@ int xenXMListDefinedDomains(virConnectPtr conn, char **const names, int maxnames
virHashForEach(priv->nameConfigMap, xenXMListIterator, &ctx);
ret = ctx.count;
-#ifndef WITH_XEN_INOTIFY
cleanup:
-#endif
xenUnifiedUnlock(priv);
return ret;
}
@@ -2780,16 +2783,12 @@ int xenXMNumOfDefinedDomains(virConnectPtr conn) {
priv = conn->privateData;
xenUnifiedLock(priv);
-#ifndef WITH_XEN_INOTIFY
- if (xenXMConfigCacheRefresh (conn) < 0)
+ if (!xenInotifyActive(conn) && xenXMConfigCacheRefresh (conn) < 0)
goto cleanup;
-#endif
ret = virHashSize(priv->nameConfigMap);
-#ifndef WITH_XEN_INOTIFY
cleanup:
-#endif
xenUnifiedUnlock(priv);
return ret;
}
--
Libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list