[Cluster-devel] cluster/cman cman_tool/main.c daemon/cnxman-so ...

pcaulfield at sourceware.org pcaulfield at sourceware.org
Wed Dec 5 14:28:59 UTC 2007


CVSROOT:	/cvs/cluster
Module name:	cluster
Changes by:	pcaulfield at sourceware.org	2007-12-05 14:28:58

Modified files:
	cman/cman_tool : main.c 
	cman/daemon    : cnxman-socket.h commands.c 
	cman/lib       : libcman.c libcman.h 

Log message:
	Print votes of quorum device in cman_tool status

Patches:
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/cman_tool/main.c.diff?cvsroot=cluster&r1=1.60&r2=1.61
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/cnxman-socket.h.diff?cvsroot=cluster&r1=1.20&r2=1.21
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/daemon/commands.c.diff?cvsroot=cluster&r1=1.76&r2=1.77
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/lib/libcman.c.diff?cvsroot=cluster&r1=1.39&r2=1.40
http://sourceware.org/cgi-bin/cvsweb.cgi/cluster/cman/lib/libcman.h.diff?cvsroot=cluster&r1=1.37&r2=1.38

--- cluster/cman/cman_tool/main.c	2007/11/29 11:19:12	1.60
+++ cluster/cman/cman_tool/main.c	2007/12/05 14:28:58	1.61
@@ -201,6 +201,7 @@
 	char info_buf[PIPE_BUF];
 	char tmpbuf[1024];
 	cman_extra_info_t *einfo = (cman_extra_info_t *)info_buf;
+	cman_qdev_info qinfo;
 	int quorate;
 	int i;
 	int j;
@@ -228,6 +229,8 @@
 							  einfo->ei_node_state));
 	printf("Nodes: %d\n", einfo->ei_members);
 	printf("Expected votes: %d\n", einfo->ei_expected_votes);
+	if (cman_get_quorum_device(h, &qinfo) == 0 && qinfo.qi_state == 1)
+		printf("Quorum device votes: %d\n", qinfo.qi_votes);
 	printf("Total votes: %d\n", einfo->ei_total_votes);
 
 	printf("Quorum: %d %s\n", einfo->ei_quorum, quorate?" ":"Activity blocked");
@@ -456,7 +459,6 @@
 	int format[MAX_FORMAT_OPTS];
 	cman_node_t *dis_nodes;
 	cman_node_t *nodes;
-	cman_node_t qdev_node;
 
 	h = open_cman_handle(0);
 
@@ -508,12 +510,7 @@
 		printf("Node  Sts   Inc   Joined               Name\n");
 	}
 
-	/* Get quorum device & print it. */
-	memset(&qdev_node, 0, sizeof(qdev_node));
-	if (!cman_get_node(h, CMAN_NODEID_QDISK, &qdev_node))
-		print_node(comline, h, format, &qdev_node);
-
-	/* Print 'real' nodes */
+	/* Print nodes */
 	for (i = 0; i < numnodes; i++) {
 		print_node(comline, h, format, &nodes[i]);
 	}
--- cluster/cman/daemon/cnxman-socket.h	2007/11/05 15:15:53	1.20
+++ cluster/cman/daemon/cnxman-socket.h	2007/12/05 14:28:58	1.21
@@ -54,6 +54,7 @@
 #define CMAN_CMD_STOP_CONFCHG       0x000000c1
 #define CMAN_CMD_SET_DIRTY          0x800000c2
 #define CMAN_CMD_SET_DEBUGLOG       0x800000c3
+#define CMAN_CMD_GET_QUORUMDEV      0x000000c4
 
 #define CMAN_CMD_DATA               0x00000100
 #define CMAN_CMD_BIND               0x00000101
@@ -256,6 +257,12 @@
 	char fence_agent[MAX_FENCE_AGENT_NAME_LEN];
 };
 
+struct cl_qdev_info {
+	char name[MAX_CLUSTER_MEMBER_NAME_LEN];
+	int state;
+	int votes;
+};
+
 /* Commands to the barrier cmd */
 #define BARRIER_CMD_REGISTER 1
 #define BARRIER_CMD_CHANGE   2
--- cluster/cman/daemon/commands.c	2007/11/29 11:19:12	1.76
+++ cluster/cman/daemon/commands.c	2007/12/05 14:28:58	1.77
@@ -1024,6 +1024,21 @@
         return 0;
 }
 
+static int do_cmd_get_quorum_device(char *cmdbuf, char *retbuf, int *retlen)
+{
+	struct cl_qdev_info *qdi = (struct cl_qdev_info *)retbuf;
+
+        if (!quorum_device)
+                return -EINVAL;
+
+	strcpy(qdi->name, quorum_device->name);
+	qdi->state = (quorum_device->state == NODESTATE_MEMBER);
+	qdi->votes = quorum_device->votes;
+	*retlen = sizeof(struct cl_qdev_info);
+
+	return 0;
+}
+
 static void ccsd_timer_fn(void *arg)
 {
 	int ccs_err;
@@ -1276,6 +1291,10 @@
 		err = do_cmd_get_cluster(cmdbuf, outbuf+offset, retlen);
 		break;
 
+	case CMAN_CMD_GET_QUORUMDEV:
+		err = do_cmd_get_quorum_device(cmdbuf, outbuf+offset, retlen);
+		break;
+
 	case CMAN_CMD_GETEXTRAINFO:
 		err = do_cmd_get_extrainfo(cmdbuf, retbuf, retsize, retlen, offset);
 		break;
--- cluster/cman/lib/libcman.c	2007/11/09 12:51:58	1.39
+++ cluster/cman/lib/libcman.c	2007/12/05 14:28:58	1.40
@@ -1037,6 +1037,22 @@
 	return info_call(h, CMAN_CMD_POLL_QUORUMDEV, &isavailable, sizeof(int), NULL, 0);
 }
 
+int cman_get_quorum_device(cman_handle_t handle, struct cman_qdev_info *info)
+{
+	struct cman_handle *h = (struct cman_handle *)handle;
+	int ret;
+	struct cl_qdev_info q;
+	VALIDATE_HANDLE(h);
+
+	ret = info_call(h, CMAN_CMD_GET_QUORUMDEV, NULL, 0, &q, sizeof(q));
+	if (!ret) {
+		strcpy(info->qi_name, q.name);
+		info->qi_state = q.state;
+		info->qi_votes = q.votes;
+	}
+	return ret;
+}
+
 int cman_get_fenceinfo(cman_handle_t handle, int nodeid, uint64_t *time, int *fenced, char *agent)
 {
 	struct cman_handle *h = (struct cman_handle *)handle;
--- cluster/cman/lib/libcman.h	2007/11/09 12:51:58	1.37
+++ cluster/cman/lib/libcman.h	2007/12/05 14:28:58	1.38
@@ -176,6 +176,13 @@
 					  First batch is the multicast address list */
 } cman_extra_info_t;
 
+/* Quorum device info, returned from cman_get_quorum_device() */
+typedef struct cman_qdev_info {
+	char qi_name[CMAN_MAX_NODENAME_LEN+1];
+	int  qi_state;
+	int  qi_votes;
+} cman_qdev_info;
+
 /*
  * NOTE: Apart from cman_replyto_shutdown(), you must not
  * call other cman_* functions while in these two callbacks:
@@ -394,6 +401,7 @@
 int cman_register_quorum_device(cman_handle_t handle, char *name, int votes);
 int cman_unregister_quorum_device(cman_handle_t handle);
 int cman_poll_quorum_device(cman_handle_t handle, int isavailable);
+int cman_get_quorum_device(cman_handle_t handle, struct cman_qdev_info *info);
 
 /*
  * Sets the dirty bit inside cman. This indicates that the node has




More information about the Cluster-devel mailing list