public inbox for cluster-cvs@sourceware.org
help / color / mirror / Atom feed
* dlm: master - dlm_controld: replace cman with votequorum and cfg
@ 2009-02-10 18:21 David Teigland
  0 siblings, 0 replies; only message in thread
From: David Teigland @ 2009-02-10 18:21 UTC (permalink / raw)
  To: cluster-cvs-relay

Gitweb:        http://git.fedorahosted.org/git/dlm.git?p=dlm.git;a=commitdiff;h=5045786d61b87eae5d1c3a9fe2e23e00e2da36ac
Commit:        5045786d61b87eae5d1c3a9fe2e23e00e2da36ac
Parent:        af52b7bb26a05a8f73d1076254e178b02ed192cd
Author:        David Teigland <teigland@redhat.com>
AuthorDate:    Tue Feb 10 12:17:05 2009 -0600
Committer:     David Teigland <teigland@redhat.com>
CommitterDate: Tue Feb 10 12:17:05 2009 -0600

dlm_controld: replace cman with votequorum and cfg

libcman calls have been replaced with libvotequorum
and libcfg calls, which are corosync libs.

Signed-off-by: David Teigland <teigland@redhat.com>
---
 group/dlm_controld/Makefile      |    6 +-
 group/dlm_controld/config.c      |   54 ++++++-
 group/dlm_controld/dlm_daemon.h  |    4 +-
 group/dlm_controld/main.c        |    6 +
 group/dlm_controld/member_cman.c |  317 +++++++++++++++++++-------------------
 5 files changed, 220 insertions(+), 167 deletions(-)

diff --git a/group/dlm_controld/Makefile b/group/dlm_controld/Makefile
index 7e1e1c7..9e1f9e4 100644
--- a/group/dlm_controld/Makefile
+++ b/group/dlm_controld/Makefile
@@ -31,7 +31,7 @@ OBJS +=	config.o \
 	logging.o
 endif
 
-CFLAGS += -I${ccsincdir} -I${cmanincdir} -I${logtincdir} 
+CFLAGS += -I${ccsincdir} -I${logtincdir} 
 CFLAGS += -I${dlmincdir} -I${dlmcontrolincdir}
 CFLAGS += -I${corosyncincdir} -I${openaisincdir}
 CFLAGS += -I${fencedincdir}
@@ -47,14 +47,14 @@ CFLAGS += -I${incdir}
 LDFLAGS += -L${dlmlibdir} -ldlm 
 LDFLAGS += -L${logtlibdir} -llogthread
 LDFLAGS += -L${openaislibdir} -lSaCkpt
-LDFLAGS += -L${corosynclibdir} -lcpg 
+LDFLAGS += -L${corosynclibdir} -lcpg -lcfg -lvotequorum
 LDFLAGS += -L${libdir}
 
 PCMK_LDFLAGS += -lcib -lcrmcommon -lcrmcluster -ltotem_pg
 PCMK_LDFLAGS += `pkg-config glib-2.0 --libs`
 PCMK_LDFLAGS += `xml2-config --libs`
 
-CMAN_LDFLAGS += -L${ccslibdir} -L${cmanlibdir} -lccs -lcman
+CMAN_LDFLAGS += -L${ccslibdir} -lccs
 CMAN_LDFLAGS += -L${fencedlibdir} -lfenced
 CMAN_LDDEPS += ${fencedlibdir}/libfenced.a
 
diff --git a/group/dlm_controld/config.c b/group/dlm_controld/config.c
index f56eadb..384499d 100644
--- a/group/dlm_controld/config.c
+++ b/group/dlm_controld/config.c
@@ -101,23 +101,65 @@ static int get_weight_clusternode(char *node, char *lockspace)
 	return weight;
 }
 
+static int nodeid2name(int nodeid, char *name_out)
+{
+	char path[PATH_MAX];
+	char *str, *name;
+	int i, error;
+
+	for (i = 1; ; i++) {
+		str = NULL;
+		memset(path, 0, sizeof(path));
+		sprintf(path, "/cluster/clusternodes/clusternode[%d]/@nodeid", i);
+
+		error = ccs_get(ccs_handle, path, &str);
+		if (error || !str)
+			break;
+
+		if (atoi(str) != nodeid) {
+			free(str);
+			continue;
+		}
+		free(str);
+
+		name = NULL;
+		memset(path, 0, sizeof(path));
+		sprintf(path, "/cluster/clusternodes/clusternode[%d]/@name", i);
+
+		error = ccs_get(ccs_handle, path, &name);
+		if (error || !name) {
+			log_error("node name query failed for num %d nodeid %d",
+				  i, nodeid);
+			break;
+		}
+
+		strncpy(name_out, name, PATH_MAX);
+		free(name);
+		return 0;
+	}
+
+	return -1;
+}
+
 int get_weight(int nodeid, char *lockspace)
 {
-	char *node;
-	int w;
+	char nodename[PATH_MAX];
+	int w, rv;
+
+	memset(nodename, 0, sizeof(nodename));
 
-	node = nodeid2name(nodeid);
-	if (!node) {
+	rv = nodeid2name(nodeid, nodename);
+	if (rv < 0) {
 		log_error("no name for nodeid %d", nodeid);
 		w = 1;
 		goto out;
 	}
 
-	w = get_weight_lockspace(node, lockspace);
+	w = get_weight_lockspace(nodename, lockspace);
 	if (w >= 0)
 		goto out;
 
-	w = get_weight_clusternode(node, lockspace);
+	w = get_weight_clusternode(nodename, lockspace);
 	if (w >= 0)
 		goto out;
 
diff --git a/group/dlm_controld/dlm_daemon.h b/group/dlm_controld/dlm_daemon.h
index 8c751a7..5d4ce37 100644
--- a/group/dlm_controld/dlm_daemon.h
+++ b/group/dlm_controld/dlm_daemon.h
@@ -270,7 +270,9 @@ void close_cluster(void);
 void process_cluster(int ci);
 void update_cluster(void);
 int is_cluster_member(int nodeid);
-char *nodeid2name(int nodeid);
+int setup_cluster_cfg(void);
+void close_cluster_cfg(void);
+void process_cluster_cfg(int ci);
 void kick_node_from_cluster(int nodeid);
 int fence_node_time(int nodeid, uint64_t *last_fenced_time);
 int fence_in_progress(int *count);
diff --git a/group/dlm_controld/main.c b/group/dlm_controld/main.c
index 12fb04e..a7470c7 100644
--- a/group/dlm_controld/main.c
+++ b/group/dlm_controld/main.c
@@ -853,6 +853,11 @@ static void loop(void)
 		goto out;
 	client_add(rv, process_listener, NULL);
 
+	rv = setup_cluster_cfg();
+	if (rv < 0)
+		goto out;
+	client_add(rv, process_cluster_cfg, cluster_dead);
+
 	rv = setup_cluster();
 	if (rv < 0)
 		goto out;
@@ -963,6 +968,7 @@ static void loop(void)
 	close_logging();
 	close_ccs();
 	close_cluster();
+	close_cluster_cfg();
 
 	if (!list_empty(&lockspaces))
 		log_error("lockspaces abandoned");
diff --git a/group/dlm_controld/member_cman.c b/group/dlm_controld/member_cman.c
index 19403f5..96cacf2 100644
--- a/group/dlm_controld/member_cman.c
+++ b/group/dlm_controld/member_cman.c
@@ -1,34 +1,37 @@
 #include "dlm_daemon.h"
 #include "config.h"
-#include <libcman.h>
+#include <corosync/corotypes.h>
+#include <corosync/cfg.h>
+#include <corosync/votequorum.h>
 #include "libfenced.h"
 
-static cman_handle_t	ch;
-static cman_handle_t	ch_admin;
-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;
+static corosync_cfg_handle_t	ch;
+static votequorum_handle_t	qh;
+static votequorum_node_t	old_nodes[MAX_NODES];
+static int			old_node_count;
+static votequorum_node_t	quorum_nodes[MAX_NODES];
+static int			quorum_node_count;
 
 void kick_node_from_cluster(int nodeid)
 {
 	if (!nodeid) {
-		log_error("telling cman to shut down cluster locally");
-		cman_shutdown(ch_admin, CMAN_SHUTDOWN_ANYWAY);
+		log_error("telling corosync to shut down cluster locally");
+		corosync_cfg_try_shutdown(ch,
+				COROSYNC_CFG_SHUTDOWN_FLAG_IMMEDIATE);
 	} else {
-		log_error("telling cman to remove nodeid %d from cluster",
+		log_error("telling corosync to remove nodeid %d from cluster",
 			  nodeid);
-		cman_kill_node(ch_admin, nodeid);
+		corosync_cfg_kill_node(ch, nodeid, "dlm_controld");
 	}
 }
 
-static int is_member(cman_node_t *node_list, int count, int nodeid)
+static int is_member(votequorum_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;
+		if (node_list[i].nodeid == nodeid)
+			return (node_list[i].state == NODESTATE_MEMBER);
 	}
 	return 0;
 }
@@ -40,202 +43,202 @@ static int is_old_member(int nodeid)
 
 int is_cluster_member(int nodeid)
 {
-	return is_member(cman_nodes, cman_node_count, nodeid);
+	return is_member(quorum_nodes, quorum_node_count, nodeid);
 }
 
-static cman_node_t *find_cman_node(int nodeid)
-{
-	int i;
-
-	for (i = 0; i < cman_node_count; i++) {
-		if (cman_nodes[i].cn_nodeid == nodeid)
-			return &cman_nodes[i];
-	}
-	return NULL;
-}
-
-char *nodeid2name(int nodeid)
+/* what's the replacement for this? */
+#if 0
+static void cman_callback(cman_handle_t h, void *private, int reason, int arg)
 {
-	cman_node_t *cn;
-
-	cn = find_cman_node(nodeid);
-	if (!cn)
-		return NULL;
-	return cn->cn_name;
+	case CMAN_REASON_CONFIG_UPDATE:
+		setup_logging();
+		setup_ccs();
+		break;
 }
+#endif
 
 /* add a configfs dir for cluster members that don't have one,
    del the configfs dir for cluster members that are now gone */
 
-static void statechange(void)
+static void quorum_callback(votequorum_handle_t h, uint64_t context,
+			    uint32_t quorate, uint32_t node_list_entries,
+			    votequorum_node_t node_list[])
 {
-	int i, j, rv;
-	struct cman_node_address addrs[MAX_NODE_ADDRESSES];
-	int num_addrs;
-	struct cman_node_address *addrptr = addrs;
-
-	cluster_quorate = cman_is_quorate(ch);
-
-	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;
-	}
+	corosync_cfg_node_address_t addrs[MAX_NODE_ADDRESSES];
+	corosync_cfg_node_address_t *addrptr = addrs;
+	cs_error_t err;
+	int i, j, num_addrs;
 
-	/* 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;
+	cluster_quorate = quorate;
+
+	old_node_count = quorum_node_count;
+	memcpy(&old_nodes, &quorum_nodes, sizeof(old_nodes));
+
+	quorum_node_count = 0;
+	memset(&quorum_nodes, 0, sizeof(quorum_nodes));
+
+	for (i = 0; i < node_list_entries; i++) {
+		if (node_list[i].state == NODESTATE_MEMBER) {
+			memcpy(&quorum_nodes[quorum_node_count],
+			       &node_list[i], sizeof(votequorum_node_t));
+			quorum_node_count++;
 		}
 	}
 
 	for (i = 0; i < old_node_count; i++) {
-		if (old_nodes[i].cn_member &&
-		    !is_cluster_member(old_nodes[i].cn_nodeid)) {
+		if ((old_nodes[i].state == NODESTATE_MEMBER) &&
+		    !is_cluster_member(old_nodes[i].nodeid)) {
 
-			log_debug("cman: node %d removed",
-				   old_nodes[i].cn_nodeid);
+			log_debug("quorum: node %d removed",
+				   old_nodes[i].nodeid);
 
-			del_configfs_node(old_nodes[i].cn_nodeid);
+			del_configfs_node(old_nodes[i].nodeid);
 		}
 	}
 
-	for (i = 0; i < cman_node_count; i++) {
-		if (cman_nodes[i].cn_member &&
-		    !is_old_member(cman_nodes[i].cn_nodeid)) {
-
-			rv = cman_get_node_addrs(ch, cman_nodes[i].cn_nodeid,
-						 MAX_NODE_ADDRESSES,
-						 &num_addrs, addrs);
-			if (rv < 0) {
-				log_debug("cman_get_node_addrs failed, falling back to single-homed. ");
-				num_addrs = 1;
-				addrptr = &cman_nodes[i].cn_address;
+	for (i = 0; i < quorum_node_count; i++) {
+		if ((quorum_nodes[i].state == NODESTATE_MEMBER) &&
+		    !is_old_member(quorum_nodes[i].nodeid)) {
+
+			log_debug("quorum: node %d added",
+				  quorum_nodes[i].nodeid);
+
+			err = corosync_cfg_get_node_addrs(ch,
+					quorum_nodes[i].nodeid,
+					MAX_NODE_ADDRESSES,
+					&num_addrs, addrs);
+			if (err != CS_OK) {
+				log_error("corosync_cfg_get_node_addrs failed "
+					  "nodeid %d", quorum_nodes[i].nodeid);
+				continue;
 			}
 
-			log_debug("cman: node %d added",
-				  cman_nodes[i].cn_nodeid);
-
 			for (j = 0; j < num_addrs; j++) {
-				add_configfs_node(cman_nodes[i].cn_nodeid,
-						  addrptr[j].cna_address,
-						  addrptr[j].cna_addrlen,
-						  (cman_nodes[i].cn_nodeid ==
+				add_configfs_node(quorum_nodes[i].nodeid,
+						  addrptr[j].address,
+						  addrptr[j].address_length,
+						  (quorum_nodes[i].nodeid ==
 						   our_nodeid));
 			}
 		}
 	}
 }
 
-static void cman_callback(cman_handle_t h, void *private, int reason, int arg)
+static votequorum_callbacks_t quorum_callbacks =
 {
-	switch (reason) {
-	case CMAN_REASON_TRY_SHUTDOWN:
-		if (list_empty(&lockspaces))
-			cman_replyto_shutdown(ch, 1);
-		else {
-			log_debug("no to cman shutdown");
-			cman_replyto_shutdown(ch, 0);
-		}
-		break;
-	case CMAN_REASON_STATECHANGE:
-		statechange();
-		break;
-	case CMAN_REASON_CONFIG_UPDATE:
-		setup_logging();
-		setup_ccs();
-		break;
-	}
-}
+	.votequorum_notify_fn = quorum_callback,
+};
 
 void process_cluster(int ci)
 {
-	int rv;
+	cs_error_t err;
+
+	err = votequorum_dispatch(qh, CS_DISPATCH_ALL);
+	if (err != CS_OK)
+		cluster_dead(0);
+}
+
+/* Force re-read of quorum nodes */
+void update_cluster(void)
+{
+	cs_error_t err;
 
-	rv = cman_dispatch(ch, CMAN_DISPATCH_ALL);
-	if (rv == -1 && errno == EHOSTDOWN)
+	err = votequorum_dispatch(qh, CS_DISPATCH_ONE);
+	if (err != CS_OK)
 		cluster_dead(0);
 }
 
 int setup_cluster(void)
 {
-	cman_node_t node;
-	int rv, fd;
-	int init = 0, active = 0;
-
- retry_init:
-	ch_admin = cman_admin_init(NULL);
-	if (!ch_admin) {
-		if (init++ < 2) {
-			sleep(1);
-			goto retry_init;
-		}
-		log_error("cman_admin_init error %d", errno);
-		return -ENOTCONN;
-	}
+	struct votequorum_info qinfo;
+	cs_error_t err;
+	int fd;
 
-	ch = cman_init(NULL);
-	if (!ch) {
-		log_error("cman_init error %d", errno);
-		return -ENOTCONN;
-	}
+	err = votequorum_initialize(&qh, &quorum_callbacks);
+	if (err != CS_OK)
+		return -1;
 
- retry_active:
-	rv = cman_is_active(ch);
-	if (!rv) {
-		if (active++ < 2) {
-			sleep(1);
-			goto retry_active;
-		}
-		log_error("cman_is_active error %d", errno);
-		cman_finish(ch);
-		return -ENOTCONN;
-	}
+	err = votequorum_fd_get(qh, &fd);
+	if (err != CS_OK)
+		goto fail;
 
-	rv = cman_start_notification(ch, cman_callback);
-	if (rv < 0) {
-		log_error("cman_start_notification error %d %d", rv, errno);
-		cman_finish(ch);
-		return rv;
-	}
+	err = votequorum_getinfo(qh, 0, &qinfo);
+	if (err != CS_OK)
+		goto fail;
+	our_nodeid = qinfo.node_id;
 
-	fd = cman_get_fd(ch);
-
-	/* FIXME: wait here for us to be a member of the cluster */
-	memset(&node, 0, sizeof(node));
-	rv = cman_get_node(ch, CMAN_NODEID_US, &node);
-	if (rv < 0) {
-		log_error("cman_get_node us error %d %d", rv, errno);
-		cman_stop_notification(ch);
-		cman_finish(ch);
-		fd = rv;
-		goto out;
-	}
-	our_nodeid = node.cn_nodeid;
+	err = votequorum_trackstart(qh, 0, CS_TRACK_CURRENT);
+	if (err != CS_OK)
+		goto fail;
 
 	old_node_count = 0;
 	memset(&old_nodes, 0, sizeof(old_nodes));
-	cman_node_count = 0;
-	memset(&cman_nodes, 0, sizeof(cman_nodes));
- out:
+	quorum_node_count = 0;
+	memset(&quorum_nodes, 0, sizeof(quorum_nodes));
+
 	return fd;
+ fail:
+	votequorum_finalize(qh);
+	return -1;
 }
 
 void close_cluster(void)
 {
-	cman_finish(ch);
+	votequorum_trackstop(qh);
+	votequorum_finalize(qh);
 }
 
-/* Force re-read of cman nodes */
-void update_cluster(void)
+static void shutdown_callback(corosync_cfg_handle_t h,
+			      corosync_cfg_shutdown_flags_t flags)
+{
+	if (flags & COROSYNC_CFG_SHUTDOWN_FLAG_REQUEST) {
+		if (list_empty(&lockspaces))
+			corosync_cfg_replyto_shutdown(ch,
+					COROSYNC_CFG_SHUTDOWN_FLAG_YES);
+		else {
+			log_debug("no to corosync shutdown");
+			corosync_cfg_replyto_shutdown(ch,
+					COROSYNC_CFG_SHUTDOWN_FLAG_NO);
+		}
+	}
+}
+
+static corosync_cfg_callbacks_t cfg_callbacks =
+{
+	.corosync_cfg_shutdown_callback = shutdown_callback,
+	.corosync_cfg_state_track_callback = NULL,
+};
+
+void process_cluster_cfg(int ci)
+{
+	cs_error_t err;
+
+	err = corosync_cfg_dispatch(ch, CS_DISPATCH_ALL);
+	if (err != CS_OK)
+		cluster_dead(0);
+}
+
+int setup_cluster_cfg(void)
+{
+	cs_error_t err;
+	int fd;
+
+	err = corosync_cfg_initialize(&ch, &cfg_callbacks);
+	if (err != CS_OK)
+		return -1;
+
+	err = corosync_cfg_fd_get(ch, &fd);
+	if (err != CS_OK) {
+		corosync_cfg_finalize(ch);
+		return -1;
+	}
+
+	return fd;
+}
+
+void close_cluster_cfg(void)
 {
-	statechange();
+	corosync_cfg_finalize(ch);
 }
 
 int fence_node_time(int nodeid, uint64_t *last_fenced_time)


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2009-02-10 18:21 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-02-10 18:21 dlm: master - dlm_controld: replace cman with votequorum and cfg David Teigland

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).