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