]> xenbits.xensource.com Git - libvirt.git/commitdiff
Don't ignore all dbus connection errors
authorDaniel P. Berrange <berrange@redhat.com>
Fri, 11 Oct 2013 16:50:43 +0000 (17:50 +0100)
committerDaniel P. Berrange <berrange@redhat.com>
Mon, 14 Oct 2013 09:33:10 +0000 (10:33 +0100)
Previous commit

  commit 7ada155cdf2bbfac16ce08f64abb455a940e2cf7
  Author: Gao feng <gaofeng@cn.fujitsu.com>
  Date:   Wed Sep 11 11:15:02 2013 +0800

    DBus: introduce virDBusIsServiceEnabled

Made the cgroups code fallback to non-systemd based setup
when dbus is not running. It was too big a hammer though,
as it did not check what error code was received when the
dbus connection failed. Thus it silently ignored serious
errors from dbus such as "too many client connections",
which should always be treated as fatal.

We only want to ignore errors if the dbus unix socket does
not exist, or if nothing is listening on it.

Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
src/nwfilter/nwfilter_driver.c
src/util/virdbus.c
src/util/virsystemd.c

index d25c6f2be09248430c37105fff593159c3e7b2c3..6602d730b9a69e5d58b258e73fe035cc807f3645 100644 (file)
@@ -175,8 +175,9 @@ nwfilterStateInitialize(bool privileged,
     DBusConnection *sysbus = NULL;
 
 #if WITH_DBUS
-    if (virDBusHasSystemBus())
-        sysbus = virDBusGetSystemBus();
+    if (virDBusHasSystemBus() &&
+        !(sysbus = virDBusGetSystemBus()))
+        return -1;
 #endif /* WITH_DBUS */
 
     if (VIR_ALLOC(driverState) < 0)
index dc4ace0ea417dbb7d15e5ac2897dc69d1a957069..4e4c267126839e38c1258e11d10fa377e235d938 100644 (file)
@@ -111,14 +111,29 @@ virDBusGetSystemBus(void)
 }
 
 
+/**
+ * virDBusHasSystemBus:
+ *
+ * Check if dbus system bus is running. This does not
+ * imply that we have a connection. DBus might be running
+ * and refusing connections due to its client limit. The
+ * latter must be treated as a fatal error.
+ *
+ * Return false if dbus is not available, true if probably available.
+ */
 bool
 virDBusHasSystemBus(void)
 {
     if (virDBusGetSystemBusInternal())
         return true;
 
-    VIR_DEBUG("System DBus not available: %s", NULLSTR(systemdbuserr.message));
-    return false;
+    if (systemdbuserr.name &&
+        (STREQ(systemdbuserr.name, "org.freedesktop.DBus.Error.FileNotFound") ||
+         STREQ(systemdbuserr.name, "org.freedesktop.DBus.Error.NoServer"))) {
+        VIR_DEBUG("System DBus not available: %s", NULLSTR(systemdbuserr.message));
+        return false;
+    }
+    return true;
 }
 
 
@@ -1257,7 +1272,8 @@ int virDBusIsServiceEnabled(const char *name)
     if (!virDBusHasSystemBus())
         return -2;
 
-    conn = virDBusGetSystemBus();
+    if (!(conn = virDBusGetSystemBus()))
+        return -1;
 
     if (virDBusCallMethod(conn,
                           &reply,
index 1ba37ccdfe74338748cb40342bc3e099eab133b6..503fff752bb39660ab1d5651ddf75afdbb5eb0f2 100644 (file)
@@ -169,7 +169,8 @@ int virSystemdCreateMachine(const char *name,
     if (ret < 0)
         return ret;
 
-    conn = virDBusGetSystemBus();
+    if (!(conn = virDBusGetSystemBus()))
+        return -1;
 
     ret = -1;
     if (!(machinename = virSystemdMakeMachineName(name, drivername, privileged)))
@@ -267,7 +268,8 @@ int virSystemdTerminateMachine(const char *name,
     if (ret < 0)
         return ret;
 
-    conn = virDBusGetSystemBus();
+    if (!(conn = virDBusGetSystemBus()))
+        return -1;
 
     ret = -1;
     if (!(machinename = virSystemdMakeMachineName(name, drivername, privileged)))