Re: [PATCH] quorumtool: fix display when nodenames or reverse lookup is missing

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

 



ACK

and about question. There can be (theoretically) anything up to ICMAP_MAX_VALUE_LEN (what is 16K actually) but I would go with something smaller (like as you said _POSIX_HOST_NAME_MAX).

Honza

Fabio M. Di Nitto napsal(a):
From: "Fabio M. Di Nitto"<fdinitto@xxxxxxxxxx>

when requesting nodename in ring0_addr, and reverse dns lookup
is not available, quorumtool output becomes inconsistent.

quorum {
     provider: corosync_votequorum
}

nodelist {
         node {
                 ring0_addr: fedora-master-node1
                 nodeid: 1
         }
         node {
                 ring0_addr: fedora-master-node2
                 nodeid: 2
         }
}

[fabbione@daikengo corosync]$ nslookup fedora-master-node1
..
Address: 192.168.2.193

[fabbione@daikengo corosync]$ nslookup 192.168.2.193
..
** server can't find 193.2.168.192.in-addr.arpa.: NXDOMAIN

[root@fedora-master-node1 tools]# corosync-quorumtool -s
...

Membership information
----------------------
     Nodeid      Votes    Qdevice Name
          1          1         NR fedora-master-node1.int.fabbione.net
          2          1         NR 192.168.2.194

(similar on the other node)

With this patch, when nodelist is available, we simply return ring0_addr
name for a node, fixing the output to be:

Membership information
----------------------
     Nodeid      Votes    Qdevice Name
          1          1         NR fedora-master-node1
          2          1         NR fedora-master-node2

that also removes possible inconsistencies between nodename, FQDN
and so on, by using what user requested in corosync.conf

In case ring0_addr is not available or numeric output is requested,
behavior remains as before.

Signed-off-by: Fabio M. Di Nitto<fdinitto@xxxxxxxxxx>
---
  tools/corosync-quorumtool.c |   64 +++++++++++++++++++++++++++++++++++++++++++
  1 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/tools/corosync-quorumtool.c b/tools/corosync-quorumtool.c
index 327669b..9582950 100644
--- a/tools/corosync-quorumtool.c
+++ b/tools/corosync-quorumtool.c
@@ -219,6 +219,60 @@ static int set_expected(int expected_votes)
  }

  /*
+ *  node name by nodelist
+ */
+
+static const char *node_name_by_nodelist(uint32_t nodeid)
+{
+	cmap_iter_handle_t iter;
+	char key_name[CMAP_KEYNAME_MAXLEN];
+	char tmp_key[CMAP_KEYNAME_MAXLEN];
+	static char ret_buf[4096]; /* FIX ME */
+	char *str = NULL;
+	uint32_t node_pos, cur_nodeid;
+	int res = 0;
+
+	if (cmap_iter_init(cmap_handle, "nodelist.node.",&iter) != CS_OK) {
+		return "";
+	}
+
+	memset(ret_buf, 0, sizeof(ret_buf));
+
+	while ((cmap_iter_next(cmap_handle, iter, key_name, NULL, NULL)) == CS_OK) {
+
+		res = sscanf(key_name, "nodelist.node.%u.%s",&node_pos, tmp_key);
+		if (res != 2) {
+			continue;
+		}
+
+		if (strcmp(tmp_key, "ring0_addr") != 0) {
+			continue;
+		}
+
+		snprintf(tmp_key, CMAP_KEYNAME_MAXLEN, "nodelist.node.%u.nodeid", node_pos);
+		if (cmap_get_uint32(cmap_handle, tmp_key,&cur_nodeid) != CS_OK) {
+			continue;
+		}
+		if (cur_nodeid != nodeid) {
+			continue;
+		}
+		snprintf(tmp_key, CMAP_KEYNAME_MAXLEN, "nodelist.node.%u.ring0_addr", node_pos);
+		if (cmap_get_string(cmap_handle, tmp_key,&str) != CS_OK) {
+			continue;
+		}
+		if (!str) {
+			continue;
+		}
+		strncpy(ret_buf, str, sizeof(ret_buf) - 1);
+		free(str);
+		break;
+	}
+	cmap_iter_finalize(cmap_handle, iter);
+
+	return ret_buf;
+}
+
+/*
   * This resolves the first address assigned to a node
   * and returns the name or IP address. Use cfgtool if you need more information.
   */
@@ -228,9 +282,19 @@ static const char *node_name(uint32_t nodeid, name_format_t name_format)
  	int numaddrs;
  	corosync_cfg_node_address_t addrs[INTERFACE_MAX];
  	static char buf[INET6_ADDRSTRLEN];
+	const char *nodelist_name = NULL;
  	socklen_t addrlen;
  	struct sockaddr_storage *ss;

+	if (name_format == ADDRESS_FORMAT_NAME) {
+		nodelist_name = node_name_by_nodelist(nodeid);
+	}
+
+	if ((nodelist_name)&&
+	    (strlen(nodelist_name)>  0)) {
+		return nodelist_name;
+	}
+
  	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: %s\n", nodeid, cs_strerror(err));

_______________________________________________
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