[SCM] CTDB repository - branch master updated - 0a4e667f42c6fb23be13651f7b0d0a545a49900b

Ronnie Sahlberg sahlberg at samba.org
Tue Apr 22 15:41:09 GMT 2008


The branch, master has been updated
       via  0a4e667f42c6fb23be13651f7b0d0a545a49900b (commit)
      from  eff3f326f8ce6070c9f3c430cd14d1b71a8db220 (commit)

http://gitweb.samba.org/?p=sahlberg/ctdb.git;a=shortlog;h=master


- Log -----------------------------------------------------------------
commit 0a4e667f42c6fb23be13651f7b0d0a545a49900b
Author: Ronnie Sahlberg <sahlberg at samba.org>
Date:   Wed Apr 23 00:55:57 2008 +1000

    add support for -n all   in "ctdb -n all ip"
    this collects all public addresses from all nodes and presents the public ips
    for the entire cluster

-----------------------------------------------------------------------

Summary of changes:
 tools/ctdb.c |   96 +++++++++++++++++++++++++++++++++++++++++++++++++++++++--
 1 files changed, 92 insertions(+), 4 deletions(-)


Changeset truncated at 500 lines:

diff --git a/tools/ctdb.c b/tools/ctdb.c
index f7a8610..2a3228b 100644
--- a/tools/ctdb.c
+++ b/tools/ctdb.c
@@ -28,6 +28,7 @@
 #include "cmdline.h"
 #include "../include/ctdb.h"
 #include "../include/ctdb_private.h"
+#include "../common/rb_tree.h"
 
 static void usage(void);
 
@@ -785,6 +786,84 @@ static int tickle_tcp(struct ctdb_context *ctdb, int argc, const char **argv)
 }
 
 
+struct node_ip {
+	uint32_t pnn;
+	struct sockaddr_in sin;
+};
+
+void getips_store_callback(void *param, void *data)
+{
+	struct node_ip *node_ip = (struct node_ip *)data;
+	struct ctdb_all_public_ips *ips = param;
+	int i;
+
+	i = ips->num++;
+	ips->ips[i].pnn = node_ip->pnn;
+	ips->ips[i].sin = node_ip->sin;
+}
+
+void getips_count_callback(void *param, void *data)
+{
+	uint32_t *count = param;
+
+	(*count)++;
+}
+
+static int
+control_get_all_public_ips(struct ctdb_context *ctdb, TALLOC_CTX *tmp_ctx, struct ctdb_all_public_ips **ips)
+{
+	struct ctdb_all_public_ips *tmp_ips;
+	struct ctdb_node_map *nodemap=NULL;
+	trbt_tree_t *tree;
+	int i, j, len, ret;
+	uint32_t count;
+
+	ret = ctdb_ctrl_getnodemap(ctdb, TIMELIMIT(), CTDB_CURRENT_NODE, tmp_ctx, &nodemap);
+	if (ret != 0) {
+		DEBUG(DEBUG_ERR, ("Unable to get nodemap from node %u\n", options.pnn));
+		return ret;
+	}
+
+	tree = trbt_create(tmp_ctx, 0);
+
+	for(i=0;i<nodemap->num;i++){
+		if (nodemap->nodes[i].flags & NODE_FLAGS_DISCONNECTED) {
+			continue;
+		}
+
+		/* read the public ip list from this node */
+		ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), nodemap->nodes[i].pnn, tmp_ctx, &tmp_ips);
+		if (ret != 0) {
+			DEBUG(DEBUG_ERR, ("Unable to get public ip list from node %u\n", nodemap->nodes[i].pnn));
+			return -1;
+		}
+	
+		for (j=0; j<tmp_ips->num;j++) {
+			struct node_ip *node_ip;
+
+			node_ip = talloc(tmp_ctx, struct node_ip);
+			node_ip->pnn = tmp_ips->ips[j].pnn;
+			node_ip->sin = tmp_ips->ips[j].sin;
+
+			trbt_insert32(tree, tmp_ips->ips[j].sin.sin_addr.s_addr, node_ip);
+		}
+		talloc_free(tmp_ips);
+	}
+
+	/* traverse */
+	count = 0;
+	trbt_traversearray32(tree, 1, getips_count_callback, &count);
+
+	len = offsetof(struct ctdb_all_public_ips, ips) + 
+		count*sizeof(struct ctdb_public_ip);
+	tmp_ips = talloc_zero_size(tmp_ctx, len);
+	trbt_traversearray32(tree, 1, getips_store_callback, tmp_ips);
+
+	*ips = tmp_ips;
+
+	return 0;
+}
+
 /*
   display public ip status
  */
@@ -794,8 +873,13 @@ static int control_ip(struct ctdb_context *ctdb, int argc, const char **argv)
 	TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
 	struct ctdb_all_public_ips *ips;
 
-	/* read the public ip list from this node */
-	ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), options.pnn, tmp_ctx, &ips);
+	if (options.pnn == CTDB_BROADCAST_ALL) {
+		/* read the list of public ips from all nodes */
+		ret = control_get_all_public_ips(ctdb, tmp_ctx, &ips);
+	} else {
+		/* read the public ip list from this node */
+		ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), options.pnn, tmp_ctx, &ips);
+	}
 	if (ret != 0) {
 		DEBUG(DEBUG_ERR, ("Unable to get public ips from node %u\n", options.pnn));
 		talloc_free(tmp_ctx);
@@ -805,7 +889,11 @@ static int control_ip(struct ctdb_context *ctdb, int argc, const char **argv)
 	if (options.machinereadable){
 		printf(":Public IP:Node:\n");
 	} else {
-		printf("Public IPs on node %u\n", options.pnn);
+		if (options.pnn == CTDB_BROADCAST_ALL) {
+			printf("Public IPs on ALL nodes\n");
+		} else {
+			printf("Public IPs on node %u\n", options.pnn);
+		}
 	}
 
 	for (i=1;i<=ips->num;i++) {
@@ -1582,7 +1670,7 @@ static const struct {
 	{ "listvars",        control_listvars,          true,  "list tunable variables"},
 	{ "statistics",      control_statistics,        false, "show statistics" },
 	{ "statisticsreset", control_statistics_reset,  true,  "reset statistics"},
-	{ "ip",              control_ip,                true,  "show which public ip's that ctdb manages" },
+	{ "ip",              control_ip,                false,  "show which public ip's that ctdb manages" },
 	{ "process-exists",  control_process_exists,    true,  "check if a process exists on a node",  "<pid>"},
 	{ "getdbmap",        control_getdbmap,          true,  "show the database map" },
 	{ "catdb",           control_catdb,             true,  "dump a database" ,                     "<dbname>"},


-- 
CTDB repository


More information about the samba-cvs mailing list