cluster: RHEL6 - rgmanager: Retry dbus if we get disconnected
Lon Hohberger
lon at fedoraproject.org
Thu Feb 3 20:12:31 UTC 2011
Gitweb: http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=cb93b21cd08d6c6ed206d1cc026c8f66f67bec93
Commit: cb93b21cd08d6c6ed206d1cc026c8f66f67bec93
Parent: 7a2fb0827053eeba08bd254c46cc01506a6ed492
Author: Lon Hohberger <lhh at redhat.com>
AuthorDate: Wed Feb 2 13:48:10 2011 -0500
Committer: Lon Hohberger <lhh at redhat.com>
CommitterDate: Thu Feb 3 15:11:59 2011 -0500
rgmanager: Retry dbus if we get disconnected
Resolves: rhbz#657756
Signed-off-by: Lon Hohberger <lhh at redhat.com>
Reviewed-by: Fabio M. Di Nitto <fdinitto at redhat.com>
---
rgmanager/src/daemons/main.c | 9 ++++-
rgmanager/src/daemons/update-dbus.c | 60 ++++++++++++++++++++++++-----------
2 files changed, 48 insertions(+), 21 deletions(-)
diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index 1929072..dad379a 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -684,6 +684,8 @@ event_loop(msgctx_t *localctx, msgctx_t *clusterctx)
dump_internal_state("/var/lib/cluster/rgmanager-dump");
}
+ rgm_dbus_init();
+
while (running && (tv.tv_sec || tv.tv_usec)) {
FD_ZERO(&rfds);
max = -1;
@@ -1035,8 +1037,11 @@ main(int argc, char **argv)
configure_rgmanager(-1, debug, &cluster_timeout);
logt_print(LOG_NOTICE, "Resource Group Manager Starting\n");
- if (rgm_dbus_notify && rgm_dbus_init() != 0)
- logt_print(LOG_NOTICE, "Failed to initialize DBus\n");
+ if (rgm_dbus_notify && rgm_dbus_init() != 0) {
+ rgm_dbus_notify = 0;
+ logt_print(LOG_NOTICE, "Failed to initialize DBus; "
+ "notifications disabled\n");
+ }
if (init_resource_groups(0, do_init) != 0) {
logt_print(LOG_CRIT, "#8: Couldn't initialize services\n");
diff --git a/rgmanager/src/daemons/update-dbus.c b/rgmanager/src/daemons/update-dbus.c
index a3fb5e7..c9bbf40 100644
--- a/rgmanager/src/daemons/update-dbus.c
+++ b/rgmanager/src/daemons/update-dbus.c
@@ -21,8 +21,6 @@
static DBusConnection *db = NULL;
static pthread_mutex_t mu = PTHREAD_MUTEX_INITIALIZER;
static pthread_t th = 0;
-static char _err[512];
-static int err_set = 0;
#endif
/* Set this to the desired value prior to calling rgm_dbus_init() */
@@ -39,20 +37,29 @@ rgm_dbus_init(void)
if (!rgm_dbus_notify)
return 0;
+ pthread_mutex_lock(&mu);
+ if (db) {
+ pthread_mutex_unlock(&mu);
+ return 0;
+ }
+
dbus_error_init(&err);
- dbc = dbus_bus_get(DBUS_BUS_SYSTEM, &err);
+ dbc = dbus_bus_get_private(DBUS_BUS_SYSTEM, &err);
if (!dbc) {
- snprintf(_err, sizeof(_err),
- "dbus_bus_get: %s", err.message);
- err_set = 1;
+ logt_print(LOG_ERR,
+ "DBus Failed to initialize: dbus_bus_get: %s\n",
+ err.message);
dbus_error_free(&err);
+ pthread_mutex_unlock(&mu);
return -1;
}
dbus_connection_set_exit_on_disconnect(dbc, FALSE);
db = dbc;
+ pthread_mutex_unlock(&mu);
+ logt_print(LOG_DEBUG, "DBus Notifications Initialized\n");
return 0;
}
#else
@@ -63,9 +70,9 @@ rgm_dbus_init(void)
#endif
-int
-rgm_dbus_release(void)
#ifdef DBUS
+static int
+_rgm_dbus_release(int err)
{
pthread_t t;
@@ -74,17 +81,39 @@ rgm_dbus_release(void)
/* tell thread to exit - not sure how to tell dbus
* to wake up, so just have it poll XXX */
+
+ /* if the thread left because the dbus connection died,
+ this block is avoided since the thread exits */
if (th) {
t = th;
th = 0;
pthread_join(t, NULL);
}
+ dbus_connection_close(db);
dbus_connection_unref(db);
db = NULL;
+ if (err)
+ logt_print(LOG_ERR, "DBus Connection Lost\n");
+ else
+ logt_print(LOG_DEBUG, "DBus Released\n");
return 0;
}
+#endif
+
+
+int
+rgm_dbus_release(void)
+#ifdef DBUS
+{
+ int ret;
+
+ pthread_mutex_lock(&mu);
+ ret = _rgm_dbus_release(0);
+ pthread_mutex_unlock(&mu);
+ return ret;
+}
#else
{
return 0;
@@ -98,14 +127,12 @@ _dbus_auto_flush(void *arg)
{
/* DBus connection functions are thread safe */
dbus_connection_ref(db);
-
while (dbus_connection_read_write(db, 500)) {
if (!th)
break;
}
dbus_connection_unref(db);
-
th = 0;
return NULL;
}
@@ -121,11 +148,6 @@ _rgm_dbus_notify(const char *svcname,
DBusMessage *msg = NULL;
int ret = -1;
- if (err_set) {
- fprintf(stderr, "%s\n", _err);
- err_set = 0;
- }
-
if (!db) {
goto out_free;
}
@@ -133,9 +155,7 @@ _rgm_dbus_notify(const char *svcname,
pthread_mutex_lock(&mu);
if (dbus_connection_get_is_connected(db) != TRUE) {
- err_set = 1;
- snprintf(_err, sizeof(_err), "DBus connection lost");
- rgm_dbus_release();
+ _rgm_dbus_release(1);
goto out_unlock;
}
@@ -184,6 +204,8 @@ rgm_dbus_update(char *key, uint64_t view, void *data, uint32_t size)
if (!rgm_dbus_notify)
goto out_free;
+ if (!db)
+ goto out_free;
if (view == 1)
goto out_free;
if (size != (sizeof(*st)))
@@ -209,6 +231,7 @@ rgm_dbus_update(char *key, uint64_t view, void *data, uint32_t size)
if (!last)
last = "(none)";
+ flags[0] = 0;
rg_flags_str(flags, sizeof(flags), st->rs_flags, (char *)" ");
if (flags[0] == 0)
snprintf(flags, sizeof(flags), "(none)");
@@ -221,7 +244,6 @@ rgm_dbus_update(char *key, uint64_t view, void *data, uint32_t size)
logt_print(LOG_ERR, "Error sending update for %s; "
"notifications disabled\n", key);
rgm_dbus_release();
- rgm_dbus_notify = 0;
}
out_free:
More information about the cluster-commits
mailing list