1
0
mirror of https://github.com/samba-team/samba.git synced 2024-12-23 17:34:34 +03:00

ctdb ip must loop over all connected nodes to pull hte public ip list

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)
This commit is contained in:
Ronnie Sahlberg 2007-09-07 16:45:19 +10:00
parent 3cad21d6be
commit d91b28f8b7

View 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;
}
/* 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;
}
/* 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");
for(i=0;i<ips->num;i++){
printf(":%s:%d:\n",
inet_ntoa(ips->ips[i].sin.sin_addr),
ips->ips[i].pnn);
}
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);
}
trbt_traversearray32(tree, 1, print_ip, NULL);
talloc_free(tmp_ctx);
return 0;
}