cluster: STABLE31 - rgmanager: Send events on service stop & preserve frozen flag

Lon Hohberger lon at fedoraproject.org
Thu Oct 27 23:30:36 UTC 2011


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=707e2c72c21ab0b90ad04a32cb40114dcd0cc012
Commit:        707e2c72c21ab0b90ad04a32cb40114dcd0cc012
Parent:        5ce78b0a1a1c5851524497b305a568e52043cf09
Author:        Lon Hohberger <lhh at redhat.com>
AuthorDate:    Thu Oct 27 17:54:58 2011 -0400
Committer:     Lon Hohberger <lhh at redhat.com>
CommitterDate: Thu Oct 27 19:26:24 2011 -0400

rgmanager: Send events on service stop & preserve frozen flag

The rgmanger FROZEN flag is supposed to persist until disabled
explicitly by an administrator or loss of quorum.

Resolves: rhbz#722230

Signed-off-by: Lon Hohberger <lhh at redhat.com>
---
 rgmanager/include/event.h        |    1 +
 rgmanager/src/daemons/groups.c   |   15 +++++++++++++--
 rgmanager/src/daemons/rg_state.c |    5 +++--
 3 files changed, 17 insertions(+), 4 deletions(-)

diff --git a/rgmanager/include/event.h b/rgmanager/include/event.h
index 9fc9521..1baa3a5 100644
--- a/rgmanager/include/event.h
+++ b/rgmanager/include/event.h
@@ -120,6 +120,7 @@ int slang_process_event(event_table_t *event_table, event_t *ev);
 /* For distributed events. */
 void set_transition_throttling(int nsecs);
 int get_transition_throttling(void);
+void broadcast_event(const char *svcName, uint32_t state, int owner, int last);
 
 /* Simplified service start. */
 int service_op_start(char *svcName, int *target_list, int target_list_len,
diff --git a/rgmanager/src/daemons/groups.c b/rgmanager/src/daemons/groups.c
index c4929e4..78b9de9 100644
--- a/rgmanager/src/daemons/groups.c
+++ b/rgmanager/src/daemons/groups.c
@@ -683,7 +683,7 @@ eval_groups(int local, uint32_t nodeid, int nodeStatus)
 	resource_node_t *node;
 	rg_state_t svcStatus;
 	cluster_member_list_t *membership;
-	int ret;
+	int ret, state_updated = 0;
 
 	if (rg_locked()) {
 		logt_print(LOG_DEBUG,
@@ -700,6 +700,7 @@ eval_groups(int local, uint32_t nodeid, int nodeStatus)
 
 	list_do(&_tree, node) {
 
+		state_updated = 0;
 		res_build_name(svcName, sizeof(svcName), node->rn_resource);
 
 		/*
@@ -738,7 +739,9 @@ eval_groups(int local, uint32_t nodeid, int nodeStatus)
 			svcStatus.rs_state = RG_STATE_STOPPED;
 			svcStatus.rs_owner = 0;
 			svcStatus.rs_transition = (uint64_t)time(NULL);
-			svcStatus.rs_flags = 0;
+			/* If host fails, we need to remember
+			 * frozen flag */
+			svcStatus.rs_flags &= RG_FLAG_FROZEN;
 
 			if (set_rg_state(svcName, &svcStatus) != 0) {
 				logt_print(LOG_ERR, "Failed to update state"
@@ -747,10 +750,18 @@ eval_groups(int local, uint32_t nodeid, int nodeStatus)
 				rg_unlock(&lockp);
 				continue;
 			}
+
+			state_updated = 1;
 		}
 
 		rg_unlock(&lockp);
 
+		if (state_updated) {
+			/* don't do this with lock held */
+			broadcast_event(svcName, RG_STATE_STOPPED, -1,
+					svcStatus.rs_last_owner);
+		}
+
 		if (svcStatus.rs_owner == 0)
 			nodeName = (char *)"none";
 		else
diff --git a/rgmanager/src/daemons/rg_state.c b/rgmanager/src/daemons/rg_state.c
index 0d6a0e5..8b5dcaa 100644
--- a/rgmanager/src/daemons/rg_state.c
+++ b/rgmanager/src/daemons/rg_state.c
@@ -35,7 +35,7 @@ static int handle_migrate_status(const char *svcName, int ret, rg_state_t *svcSt
 
 static int _svc_stop_finish(const char *svcName, int failed, uint32_t newstate);
 
-static void
+void
 broadcast_event(const char *svcName, uint32_t state, int owner, int last)
 {
 	SmMessageSt msgp;
@@ -1508,7 +1508,8 @@ _svc_stop_finish(const char *svcName, int failed, uint32_t newstate)
 	}
 
 	svcStatus.rs_state = newstate;
-	svcStatus.rs_flags = 0;
+	/* If host fails, we need to remember frozen flag */
+	svcStatus.rs_flags &= RG_FLAG_FROZEN;
 
 	logt_print(LOG_NOTICE, "Service %s is %s\n", svcName,
 	       rg_state_str(svcStatus.rs_state));


More information about the cluster-commits mailing list