so part of the issue is cgm_* is not thread safe, but is called from various threads. e.g. if u start libvirtd w/ several instances already running, it will call cgm_dbus_connect from each.
there is a pair of global variable: static NihDBusProxy *cgroup_manager = NULL; bool cgm_running = false; in src/util/cgmanager.c, and they cause this issue. cgm_dbus_connect() overwrites cgroup_manager regardless of the state of cgm_running (and cgm_running is set @ the end of it anyway). The use of pthread_once is probably part of the solution. The below patch partially corrects. --- libvirt-1.2.8.orig/src/util/cgmanager.c +++ libvirt-1.2.8/src/util/cgmanager.c @@ -40,10 +40,12 @@ static NihDBusProxy *cgroup_manager = NULL; bool cgm_running = false; +static pthread_once_t cgmanager_is_init = PTHREAD_ONCE_INIT; + VIR_LOG_INIT("util.cgmanager"); #define CGMANAGER_DBUS_SOCK "unix:path=/sys/fs/cgroup/cgmanager/sock" -bool cgm_dbus_connect(void) +static bool _cgm_dbus_connect(void) { DBusError dbus_error; DBusConnection *connection; @@ -83,6 +85,11 @@ bool cgm_dbus_connect(void) return true; } +bool cgm_dbus_connect(void) +{ + pthread_once(&cgmanager_is_init, _cgm_dbus_connect); +} + void cgm_dbus_disconnect(void) { if (cgroup_manager) { --- libvirt-1.2.8.orig/src/util/cgmanager.h +++ libvirt-1.2.8/src/util/cgmanager.h @@ -30,6 +30,7 @@ #include <nih/alloc.h> #include <nih/error.h> #include <nih/string.h> +#include <pthread.h> extern bool cgm_running; Its not clear to me the underlying libs are all thread safe (e.g. https://bugs.launchpad.net/ubuntu/+source/libnih/+bug/1294200) there would remain the problem of... what if cgmanager goes away. 1 thread will find it, does it reconnect and fix the others? -- You received this bug notification because you are a member of Ubuntu Bugs, which is subscribed to Ubuntu. https://bugs.launchpad.net/bugs/1397130 Title: libvirt-bin crashes / refuses to restart if cgmanager is restarted To manage notifications about this bug go to: https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/1397130/+subscriptions -- ubuntu-bugs mailing list ubuntu-bugs@lists.ubuntu.com https://lists.ubuntu.com/mailman/listinfo/ubuntu-bugs