Gitweb:
http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=...
Commit: e1e194a8337d0ced672e9b6fd08f4ca0d02fb52e
Parent: 952090aca003968b8e9b47baa865cd6d603b061d
Author: Lon Hohberger <lhh(a)redhat.com>
AuthorDate: Mon Dec 21 17:54:37 2009 -0500
Committer: Lon Hohberger <lhh(a)redhat.com>
CommitterDate: Tue Dec 22 10:16:04 2009 -0500
rgmanager: Fix event generation with central_processing
This patch fixes event generation and processing when
a node dies. Effectively, what was happening is that when
a node failed and was fenced, no events for the dead
services on that host were generated. This led to dependent
services not restarting correctly in many cases.
Resolves: rhbz#523999
Signed-off-by: Lon Hohberger <lhh(a)redhat.com>
---
rgmanager/include/resgroup.h | 2 ++
rgmanager/src/daemons/main.c | 2 +-
rgmanager/src/daemons/rg_forward.c | 4 ++--
rgmanager/src/daemons/rg_state.c | 9 ++++++---
rgmanager/src/daemons/service_op.c | 2 +-
rgmanager/src/resources/default_event_script.sl | 8 ++++++++
6 files changed, 20 insertions(+), 7 deletions(-)
diff --git a/rgmanager/include/resgroup.h b/rgmanager/include/resgroup.h
index a4b53fe..ec3e67d 100644
--- a/rgmanager/include/resgroup.h
+++ b/rgmanager/include/resgroup.h
@@ -166,6 +166,8 @@ int get_rg_state_local(char *servicename, rg_state_t *svcblk);
uint32_t best_target_node(cluster_member_list_t *allowed, uint32_t owner,
char *rg_name, int lock);
+extern int cluster_timeout;
+
#ifdef DEBUG
int _rg_lock_dbg(char *, struct dlm_lksb *, char *, int);
#define rg_lock(name, p) _rg_lock_dbg(name, p, __FILE__, __LINE__)
diff --git a/rgmanager/src/daemons/main.c b/rgmanager/src/daemons/main.c
index 601e7d0..93ecff3 100644
--- a/rgmanager/src/daemons/main.c
+++ b/rgmanager/src/daemons/main.c
@@ -63,6 +63,7 @@ int32_t master_event_callback(char *key, uint64_t viewno, void *data,
uint32_t d
int node_has_fencing(int nodeid);
int fence_domain_joined(void);
+int cluster_timeout = 10;
int shutdown_pending = 0, running = 1, need_reconfigure = 0;
char debug = 0; /* XXX* */
static int signalled = 0;
@@ -1022,7 +1023,6 @@ main(int argc, char **argv)
msgctx_t *local_ctx;
pthread_t th;
cman_handle_t clu = NULL;
- int cluster_timeout = 10;
while ((rv = getopt(argc, argv, "wfdN")) != EOF) {
switch (rv) {
diff --git a/rgmanager/src/daemons/rg_forward.c b/rgmanager/src/daemons/rg_forward.c
index c827c62..bf32f1d 100644
--- a/rgmanager/src/daemons/rg_forward.c
+++ b/rgmanager/src/daemons/rg_forward.c
@@ -103,7 +103,7 @@ forwarding_thread(void *arg)
build_message(&msg, req->rr_request, req->rr_group, req->rr_target,
req->rr_arg0, req->rr_arg1);
- if (msg_open(MSG_CLUSTER, rgs.rs_owner, RG_PORT, ctx, 10) < 0) {
+ if (msg_open(MSG_CLUSTER, rgs.rs_owner, RG_PORT, ctx, 2 * cluster_timeout) < 0) {
clulog(LOG_DEBUG, "FW: Failed to open channel to %d CTX: %p\n",
rgs.rs_owner, ctx);
goto out_fail;
@@ -202,7 +202,7 @@ forwarding_thread_v2(void *arg)
strerror(errno));
goto out_fail;
}
- if (msg_open(MSG_CLUSTER, target, RG_PORT, ctx, 10) < 0) {
+ if (msg_open(MSG_CLUSTER, target, RG_PORT, ctx, 2 * cluster_timeout) < 0) {
clulog(LOG_DEBUG, "FW: Failed to open channel to %d CTX: %p\n",
target, ctx);
goto out_fail;
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index d68ce9b..ce5189c 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -1031,7 +1031,7 @@ get_new_owner(char *svcName)
continue;
if (msg_open(MSG_CLUSTER, membership->cml_members[x].cn_nodeid,
- RG_PORT, &ctx, 2) < 0) {
+ RG_PORT, &ctx, 2 * cluster_timeout) < 0) {
/* failed to open: better to claim false successful
status rather than claim a failure and possibly
end up with a service on >1 node */
@@ -1315,7 +1315,10 @@ _svc_stop(char *svcName, int req, int recover, uint32_t newstate)
rg_unlock(&lockp);
return RG_EFAIL;
}
- /* FALLTHROUGH */
+ rg_unlock(&lockp);
+ broadcast_event(svcName, RG_STATE_STOPPED,
+ -1, svcStatus.rs_last_owner);
+ return RG_ESUCCESS;
case 2:
rg_unlock(&lockp);
return RG_ESUCCESS;
@@ -1615,7 +1618,7 @@ svc_start_remote(char *svcName, int request, uint32_t target)
msg_relo.sm_data.d_svcOwner = target;
/* Open a connection to the other node */
- if (msg_open(MSG_CLUSTER, target, RG_PORT, &ctx, 2)< 0) {
+ if (msg_open(MSG_CLUSTER, target, RG_PORT, &ctx, 2 * cluster_timeout)< 0) {
clulog(LOG_ERR,
"#58: Failed opening connection to member #%d\n",
target);
diff --git a/rgmanager/src/daemons/service_op.c b/rgmanager/src/daemons/service_op.c
index 8206d50..8e1cc91 100644
--- a/rgmanager/src/daemons/service_op.c
+++ b/rgmanager/src/daemons/service_op.c
@@ -162,7 +162,7 @@ service_op_stop(char *svcName, int do_disable, int event_type)
}
}
- if (msg_open(MSG_CLUSTER, msgtarget, RG_PORT, &ctx, 2)< 0) {
+ if (msg_open(MSG_CLUSTER, msgtarget, RG_PORT, &ctx, 2 * cluster_timeout)< 0) {
clulog(LOG_ERR,
"#58: Failed opening connection to member #%d\n",
my_id());
diff --git a/rgmanager/src/resources/default_event_script.sl
b/rgmanager/src/resources/default_event_script.sl
index 7809b20..25347eb 100644
--- a/rgmanager/src/resources/default_event_script.sl
+++ b/rgmanager/src/resources/default_event_script.sl
@@ -157,6 +157,14 @@ define move_or_start(service, node_list)
(,,, owner, state) = service_status(service);
debug("Evaluating ", service, " state=", state, " owner=",
owner);
+ if ((event_type == EVENT_NODE) and (node_id == owner) and
+ (node_state == NODE_OFFLINE)) {
+ info("Marking service ", service, " on down member ",
+ owner, " as stopped");
+ if (service_stop(service) < 0) {
+ return ERR_ABORT;
+ }
+ }
len = length(node_list);
if (len == 0) {