]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
ctdb ip must loop over all connected nodes to pull hte public ip list
authorRonnie Sahlberg <sahlberg@ronnie>
Fri, 7 Sep 2007 06:45:19 +0000 (16:45 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Fri, 7 Sep 2007 06:45:19 +0000 (16:45 +1000)
and merge into a big list   since with the deassociation between a node
and a public ipaddress    the /etc/ctdb/public_addresses files can
differ between nodes and no node know about all public addresses that a
cluster can use

(This used to be ctdb commit e208294fed183977cacc44b2cd1195c11d967c18)

ctdb/tools/ctdb.c

index 0417b27943d02ec145d9e83e39e050ea47b816d5..1da8a32d09e72bd8996d5df046a01f4efd6a15af 100644 (file)
@@ -25,6 +25,7 @@
 #include "cmdline.h"
 #include "../include/ctdb.h"
 #include "../include/ctdb_private.h"
+#include "../common/rb_tree.h"
 
 static void usage(void);
 
@@ -519,44 +520,76 @@ static int tickle_tcp(struct ctdb_context *ctdb, int argc, const char **argv)
        return -1;
 }
 
+
+static void *store_ip(void *p, void *d)
+{
+       return p;
+}
+static void print_ip(void *param, void *data)
+{
+       struct ctdb_public_ip *ip = (struct ctdb_public_ip *)data;
+
+       if(options.machinereadable){
+               printf(":%s:%d:\n", inet_ntoa(ip->sin.sin_addr), ip->pnn);
+       } else {
+               printf("%-16s %d\n", inet_ntoa(ip->sin.sin_addr), ip->pnn);
+       }
+}
+
 /*
   display public ip status
  */
 static int control_ip(struct ctdb_context *ctdb, int argc, const char **argv)
 {
-       int i, ret;
+       int i, j, ret;
+       TALLOC_CTX *tmp_ctx = talloc_new(ctdb);
+       trbt_tree_t *tree;
+       struct ctdb_node_map *nodemap=NULL;
        struct ctdb_all_public_ips *ips;
-       int mypnn;
+       struct ctdb_public_ip *ip;
 
-       mypnn = ctdb_ctrl_getpnn(ctdb, TIMELIMIT(), options.pnn);
-       if (mypnn == -1) {
-               return -1;
-       }
 
-       ret = ctdb_ctrl_get_public_ips(ctdb, TIMELIMIT(), options.pnn, ctdb, &ips);
+       ret = ctdb_ctrl_getnodemap(ctdb, TIMELIMIT(), options.pnn, tmp_ctx, &nodemap);
        if (ret != 0) {
-               DEBUG(0, ("Unable to get public ips from node %u\n", options.pnn));
+               DEBUG(0, ("Unable to get nodemap from node %u\n", options.pnn));
+               talloc_free(tmp_ctx);
                return ret;
        }
 
-       if(options.machinereadable){
-               printf(":Public IP:Node:\n");
-               for(i=0;i<ips->num;i++){
-                       printf(":%s:%d:\n",
-                       inet_ntoa(ips->ips[i].sin.sin_addr),
-                       ips->ips[i].pnn);
+       /* create a tree to store the public addresses in indexed by s_addr */
+       tree = trbt_create(tmp_ctx, 0);
+       CTDB_NO_MEMORY(ctdb, tree);
+
+       for (i=0;i<nodemap->num;i++) {
+               /* dont read the public ip list from disconnected nodes */
+               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(), i, tmp_ctx, &ips);
+               if (ret != 0) {
+                       DEBUG(0, ("Unable to get public ips from node %u\n", i));
+                       talloc_free(tmp_ctx);
+                       return ret;
                }
-               return 0;
-       }
 
 
-       printf("Number of addresses:%d\n", ips->num);
-       for(i=0;i<ips->num;i++){
-               printf("%-16s %d\n",
-                       inet_ntoa(ips->ips[i].sin.sin_addr),
-                       ips->ips[i].pnn);
+               /* store the public ip */
+               for(j=0;j<ips->num;j++){
+                       ip = talloc_memdup(tmp_ctx, &ips->ips[j], sizeof(struct ctdb_public_ip));
+                       /* ntohl() so that we sort by the first octet */
+                       trbt_insert32_callback(tree, ntohl(ips->ips[j].sin.sin_addr.s_addr), store_ip, ip);
+               }
+       }
+
+       /* traverse the tree and read back all the public ips one by one */
+       if(options.machinereadable){
+               printf(":Public IP:Node:\n");
        }
+       trbt_traversearray32(tree, 1, print_ip, NULL);
 
+       talloc_free(tmp_ctx);
        return 0;
 }