[PATCH 6/6] quorum-tools: add quorum monitoring option

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



From: "Fabio M. Di Nitto" <fdinitto@xxxxxxxxxx>

Signed-off-by: Fabio M. Di Nitto <fdinitto@xxxxxxxxxx>
---
:100644 100644 bb81352... 144330c... M	tools/corosync-quorumtool.c
 tools/corosync-quorumtool.c |   98 +++++++++++++++++++++++++++++++++---------
 1 files changed, 77 insertions(+), 21 deletions(-)

diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c
index bb81352..144330c 100644
--- a/tools/corosync-quorumtool.c
+++ b/tools/corosync-quorumtool.c
@@ -71,7 +71,8 @@ typedef enum {
 	CMD_SHOWNODES,
 	CMD_SHOWSTATUS,
 	CMD_SETVOTES,
-	CMD_SETEXPECTED
+	CMD_SETEXPECTED,
+	CMD_MONITOR
 } command_t;
 
 /*
@@ -109,7 +110,7 @@ static quorum_callbacks_t q_callbacks = {
 static uint32_t g_quorate;
 static uint64_t g_ring_id;
 static uint32_t g_view_list_entries;
-static uint32_t *g_view_list;
+static uint32_t *g_view_list = NULL;
 static uint32_t g_called;
 
 /*
@@ -138,6 +139,7 @@ static void show_usage(const char *name)
 	printf("  options:\n");
 	printf("\n");
 	printf("  -s             show quorum status\n");
+	printf("  -m             monitor quorum status\n");
 	printf("  -l             list nodes\n");
 	printf("  -v <votes>     change the number of votes for a node *\n");
 	printf("  -n <nodeid>    optional nodeid of node for -v\n");
@@ -186,6 +188,7 @@ static int get_quorum_type(char *quorum_type, size_t quorum_type_len)
 
 	strncpy(quorum_type, buf, quorum_type_len - 1);
 
+	return 0;
 out:
 	return err;
 }
@@ -247,28 +250,31 @@ static int get_votes(uint32_t nodeid)
  */
 static const char *node_name(uint32_t nodeid, name_format_t name_format)
 {
-	int ret;
+	int err;
 	int numaddrs;
 	corosync_cfg_node_address_t addrs[INTERFACE_MAX];
+	static char buf[INET6_ADDRSTRLEN];
+	socklen_t addrlen;
+	struct sockaddr_storage *ss;
 
-	if (corosync_cfg_get_node_addrs(c_handle, nodeid, INTERFACE_MAX, &numaddrs, addrs) == CS_OK) {
+	err = corosync_cfg_get_node_addrs(c_handle, nodeid, INTERFACE_MAX, &numaddrs, addrs);
+	if (err != CS_OK) {
+		fprintf(stderr, "Unable to get node address for nodeid %u: %d\n", nodeid, err);
+		return "";
+	}
 
-		static char buf[INET6_ADDRSTRLEN];
-		socklen_t addrlen;
-		struct sockaddr_storage *ss = (struct sockaddr_storage *)addrs[0].address;
+	ss = (struct sockaddr_storage *)addrs[0].address;
 
-		if (ss->ss_family == AF_INET6)
-			addrlen = sizeof(struct sockaddr_in6);
-		else
-			addrlen = sizeof(struct sockaddr_in);
+	if (ss->ss_family == AF_INET6)
+		addrlen = sizeof(struct sockaddr_in6);
+	else
+		addrlen = sizeof(struct sockaddr_in);
 
-		ret = getnameinfo((struct sockaddr *)addrs[0].address, addrlen,
-				  buf, sizeof(buf),
-				  NULL, 0,
-				  (name_format == ADDRESS_FORMAT_IP)?NI_NUMERICHOST:0);
-		if (!ret)
-			return buf;
-	}
+	if (!getnameinfo((struct sockaddr *)addrs[0].address, addrlen,
+			  buf, sizeof(buf),
+			  NULL, 0,
+			  (name_format == ADDRESS_FORMAT_IP)?NI_NUMERICHOST:0))
+		return buf;
 
 	return "";
 }
@@ -284,6 +290,8 @@ static void quorum_notification_fn(
 	g_quorate = quorate;
 	g_ring_id = ring_id;
 	g_view_list_entries = view_list_entries;
+	if (g_view_list)
+		free(g_view_list);
 	g_view_list = malloc(sizeof(uint32_t) * view_list_entries);
 	if (g_view_list) {
 		memcpy(g_view_list, view_list,sizeof(uint32_t) * view_list_entries);
@@ -330,8 +338,6 @@ quorum_err:
 	if (err < 0)
 		return err;
 
-	get_quorum_type(quorum_type, sizeof(quorum_type));
-
 	printf("Version:          %s\n", VERSION);
 	printf("Nodes:            %d\n", g_view_list_entries);
 	printf("Ring ID:          %" PRIu64 "\n", g_ring_id);
@@ -366,6 +372,50 @@ quorum_err:
 	return is_quorate;
 }
 
+static int monitor_status(nodeid_format_t nodeid_format, name_format_t name_format) {
+	int err;
+
+	show_status();
+
+	printf("starting monitoring loop\n");
+
+	err=quorum_trackstart(q_handle, CS_TRACK_CHANGES);
+	if (err != CS_OK) {
+		fprintf(stderr, "quorum_trackstart FAILED: %d\n", err);
+		goto quorum_err;
+	}
+
+	while (1) {
+		time_t t;
+		int i;
+
+		err = quorum_dispatch(q_handle, CS_DISPATCH_ONE);
+		if (err != CS_OK) {
+			fprintf(stderr, "quorum_dispatch FAILED: %d\n", err);
+			goto quorum_err;
+		}
+		time(&t);
+		printf("\ndate: %s", ctime((const time_t *)&t));
+		printf("Nodes:            %d\n", g_view_list_entries);
+		printf("Ring ID:          %" PRIu64 "\n", g_ring_id);
+		printf("Quorate:          %s\n", g_quorate?"Yes":"No");
+		printf("Nodeid\tName\n");
+		for (i=0; i < g_view_list_entries; i++) {
+			if (nodeid_format == NODEID_FORMAT_DECIMAL) {
+				printf("%4u\t", g_view_list[i]);
+			} else {
+				printf("0x%04x\t", g_view_list[i]);
+			}
+			printf("%s\n", node_name(g_view_list[i], name_format));
+		}
+		free(g_view_list);
+		g_view_list = NULL;
+	}
+
+quorum_err:
+	return err;
+}
+
 static int show_nodes(nodeid_format_t nodeid_format, name_format_t name_format)
 {
 	int i;
@@ -462,7 +512,7 @@ static void close_all(void) {
 }
 
 int main (int argc, char *argv[]) {
-	const char *options = "VHsle:v:hin:d:";
+	const char *options = "VHslme:v:hin:d:";
 	char *endptr;
 	int opt;
 	int votes = 0;
@@ -487,6 +537,9 @@ int main (int argc, char *argv[]) {
 		case 's':
 			command_opt = CMD_SHOWSTATUS;
 			break;
+		case 'm':
+			command_opt = CMD_MONITOR;
+			break;
 		case 'i':
 			address_format = ADDRESS_FORMAT_IP;
 			break;
@@ -556,6 +609,9 @@ int main (int argc, char *argv[]) {
 	case CMD_SETEXPECTED:
 		ret = set_expected(votes);
 		break;
+	case CMD_MONITOR:
+		ret = monitor_status(nodeid_format, address_format);
+		break;
 	}
 
 	close_all();
-- 
1.7.7.3

_______________________________________________
discuss mailing list
discuss@xxxxxxxxxxxx
http://lists.corosync.org/mailman/listinfo/discuss


[Index of Archives]     [Linux Clusters]     [Corosync Project]     [Linux USB Devel]     [Linux Audio Users]     [Photo]     [Yosemite News]    [Yosemite Photos]    [Linux Kernel]     [Linux SCSI]     [X.Org]

  Powered by Linux