From 07efc2e98d4bd8796e4003f81baee53d3f83a06b Mon Sep 17 00:00:00 2001 Message-Id: <07efc2e98d4bd8796e4003f81baee53d3f83a06b.1381871412.git.jdenemar@redhat.com> From: "Daniel P. Berrange" Date: Mon, 14 Oct 2013 16:45:24 +0100 Subject: [PATCH] Don't ignore all dbus connection errors For https://bugzilla.redhat.com/show_bug.cgi?id=927072 Previous commit commit 7ada155cdf2bbfac16ce08f64abb455a940e2cf7 Author: Gao feng 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 (cherry picked from commit 6bd886000100be2adce8650d0579a2303a7bf85b) Signed-off-by: Jiri Denemark --- src/nwfilter/nwfilter_driver.c | 5 +++-- src/util/virdbus.c | 22 +++++++++++++++++++--- src/util/virsystemd.c | 6 ++++-- 3 files changed, 26 insertions(+), 7 deletions(-) diff --git a/src/nwfilter/nwfilter_driver.c b/src/nwfilter/nwfilter_driver.c index d25c6f2..6602d73 100644 --- a/src/nwfilter/nwfilter_driver.c +++ b/src/nwfilter/nwfilter_driver.c @@ -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) diff --git a/src/util/virdbus.c b/src/util/virdbus.c index da69430..94f3f47 100644 --- a/src/util/virdbus.c +++ b/src/util/virdbus.c @@ -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; } @@ -1240,7 +1255,8 @@ int virDBusIsServiceEnabled(const char *name) if (!virDBusHasSystemBus()) return -2; - conn = virDBusGetSystemBus(); + if (!(conn = virDBusGetSystemBus())) + return -1; if (virDBusCallMethod(conn, &reply, diff --git a/src/util/virsystemd.c b/src/util/virsystemd.c index 1ba37cc..503fff7 100644 --- a/src/util/virsystemd.c +++ b/src/util/virsystemd.c @@ -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))) -- 1.8.3.2