[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