cluster: STABLE3 - gfs_controld: watch cluster membership

David Teigland teigland at fedoraproject.org
Thu Oct 15 18:59:16 UTC 2009


Gitweb:        http://git.fedorahosted.org/git/cluster.git?p=cluster.git;a=commitdiff;h=622002d75df7bb067bca51f46731b89f2104b65a
Commit:        622002d75df7bb067bca51f46731b89f2104b65a
Parent:        f9ac100b614db85cab250d395d8999eba650438e
Author:        David Teigland <teigland at redhat.com>
AuthorDate:    Thu Oct 15 12:52:51 2009 -0500
Committer:     David Teigland <teigland at redhat.com>
CommitterDate: Thu Oct 15 12:52:51 2009 -0500

gfs_controld: watch cluster membership

Keep track of cluster membership changes so we can call the
recently added node_history_cluster_{add,remove}.
Copied from dlm_controld.

Signed-off-by: David Teigland <teigland at redhat.com>
---
 group/dlm_controld/main.c        |    2 +-
 group/gfs_controld/gfs_daemon.h  |    2 +-
 group/gfs_controld/main.c        |    3 +-
 group/gfs_controld/member_cman.c |   91 ++++++++++++++++++++++++++++++++++++-
 group/gfs_controld/member_pcmk.c |    6 ++-
 5 files changed, 97 insertions(+), 7 deletions(-)

diff --git a/group/dlm_controld/main.c b/group/dlm_controld/main.c
index 12e2592..712bed6 100644
--- a/group/dlm_controld/main.c
+++ b/group/dlm_controld/main.c
@@ -902,7 +902,7 @@ static void loop(void)
 
 	setup_monitor();
 
-	rv = setup_configfs();
+	rv = setup_configfs();		/* calls update_cluster() */
 	if (rv < 0)
 		goto out;
 
diff --git a/group/gfs_controld/gfs_daemon.h b/group/gfs_controld/gfs_daemon.h
index a69385b..af7ed45 100644
--- a/group/gfs_controld/gfs_daemon.h
+++ b/group/gfs_controld/gfs_daemon.h
@@ -70,7 +70,6 @@ extern int poll_ignore_plock;
 extern int plock_fd;
 extern int plock_ci;
 extern struct list_head mountgroups;
-extern int cluster_quorate;
 extern int our_nodeid;
 extern char *clustername;
 extern char daemon_debug_buf[256];
@@ -299,6 +298,7 @@ void cluster_dead(int ci);
 int setup_cluster(void);
 void close_cluster(void);
 void process_cluster(int ci);
+void update_cluster(void);
 void kick_node_from_cluster(int nodeid);
 
 /* plock.c */
diff --git a/group/gfs_controld/main.c b/group/gfs_controld/main.c
index 30f44eb..1ca45de 100644
--- a/group/gfs_controld/main.c
+++ b/group/gfs_controld/main.c
@@ -1136,6 +1136,8 @@ static void loop(void)
 		goto out;
 	client_add(rv, process_cluster, cluster_dead);
 
+	update_cluster();
+
 	rv = setup_ccs();
 	if (rv < 0)
 		goto out;
@@ -1565,7 +1567,6 @@ int poll_dlm;
 int plock_fd;
 int plock_ci;
 struct list_head mountgroups;
-int cluster_quorate;
 int our_nodeid;
 char *clustername;
 char daemon_debug_buf[256];
diff --git a/group/gfs_controld/member_cman.c b/group/gfs_controld/member_cman.c
index 0f78097..277a11e 100644
--- a/group/gfs_controld/member_cman.c
+++ b/group/gfs_controld/member_cman.c
@@ -2,9 +2,13 @@
 #include "config.h"
 #include <libcman.h>
 
-static cman_handle_t ch;
-static cman_handle_t ch_admin;
-static cman_cluster_t cluster;
+static cman_handle_t	ch;
+static cman_handle_t	ch_admin;
+static cman_cluster_t	cluster;
+static cman_node_t      old_nodes[MAX_NODES];
+static int              old_node_count;
+static cman_node_t      cman_nodes[MAX_NODES];
+static int              cman_node_count;
 
 void kick_node_from_cluster(int nodeid)
 {
@@ -18,6 +22,73 @@ void kick_node_from_cluster(int nodeid)
 	}
 }
 
+static int is_member(cman_node_t *node_list, int count, int nodeid)
+{
+	int i;
+
+	for (i = 0; i < count; i++) {
+		if (node_list[i].cn_nodeid == nodeid)
+			return node_list[i].cn_member;
+	}
+	return 0;
+}
+
+static int is_old_member(int nodeid)
+{
+	return is_member(old_nodes, old_node_count, nodeid);
+}
+
+static int is_cluster_member(int nodeid)
+{
+	return is_member(cman_nodes, cman_node_count, nodeid);
+}
+
+static void statechange(void)
+{
+	int i, rv;
+
+	old_node_count = cman_node_count;
+	memcpy(&old_nodes, &cman_nodes, sizeof(old_nodes));
+
+	cman_node_count = 0;
+	memset(&cman_nodes, 0, sizeof(cman_nodes));
+	rv = cman_get_nodes(ch, MAX_NODES, &cman_node_count, cman_nodes);
+	if (rv < 0) {
+		log_debug("cman_get_nodes error %d %d", rv, errno);
+		return;
+	}
+
+	/* Never allow node ID 0 to be considered a member #315711 */
+	for (i = 0; i < cman_node_count; i++) {
+		if (cman_nodes[i].cn_nodeid == 0) {
+			cman_nodes[i].cn_member = 0;
+			break;
+		}
+	}
+
+	for (i = 0; i < old_node_count; i++) {
+		if (old_nodes[i].cn_member &&
+		    !is_cluster_member(old_nodes[i].cn_nodeid)) {
+
+			log_debug("cluster node %d removed",
+				  old_nodes[i].cn_nodeid);
+
+			node_history_cluster_remove(old_nodes[i].cn_nodeid);
+		}
+	}
+
+	for (i = 0; i < cman_node_count; i++) {
+		if (cman_nodes[i].cn_member &&
+		    !is_old_member(cman_nodes[i].cn_nodeid)) {
+
+			log_debug("cluster node %d added",
+				  cman_nodes[i].cn_nodeid);
+
+			node_history_cluster_add(cman_nodes[i].cn_nodeid);
+		}
+	}
+}
+
 static void cman_callback(cman_handle_t h, void *private, int reason, int arg)
 {
 	switch (reason) {
@@ -29,6 +100,9 @@ static void cman_callback(cman_handle_t h, void *private, int reason, int arg)
 			cman_replyto_shutdown(ch, 0);
 		}
 		break;
+	case CMAN_REASON_STATECHANGE:
+		statechange();
+		break;
 	case CMAN_REASON_CONFIG_UPDATE:
 		setup_logging();
 		setup_ccs();
@@ -115,6 +189,11 @@ int setup_cluster(void)
 		goto out;
 	}
 	our_nodeid = node.cn_nodeid;
+
+ 	old_node_count = 0;
+	memset(&old_nodes, 0, sizeof(old_nodes));
+	cman_node_count = 0;
+	memset(&cman_nodes, 0, sizeof(cman_nodes));
  out:
 	return fd;
 }
@@ -125,3 +204,9 @@ void close_cluster(void)
 	cman_finish(ch_admin);
 }
 
+/* Force re-read of cman nodes */
+void update_cluster(void)
+{
+	statechange();
+}
+
diff --git a/group/gfs_controld/member_pcmk.c b/group/gfs_controld/member_pcmk.c
index 88e5528..580e137 100644
--- a/group/gfs_controld/member_pcmk.c
+++ b/group/gfs_controld/member_pcmk.c
@@ -59,7 +59,11 @@ void kick_node_from_cluster(int nodeid)
 void process_cluster(int ci)
 {
     ais_dispatch(ais_fd_async, NULL);
-    cluster_quorate = crm_have_quorum;
+    /* cluster_quorate = crm_have_quorum; */
+}
+
+void update_cluster(void)
+{
 }
 
 int setup_cluster(void)


More information about the cluster-commits mailing list