get a list of nodes (vnn and flags ) from a remote node
*/
int ctdb_ctrl_getnodemap(struct ctdb_context *ctdb, uint32_t destnode,
- TALLOC_CTX *mem_ctx, struct ctdb_node_map *nodemap)
+ TALLOC_CTX *mem_ctx, struct ctdb_node_map **nodemap)
{
int ret;
TDB_DATA data, outdata;
- int32_t i, res;
+ int32_t res;
ZERO_STRUCT(data);
- ZERO_STRUCT(*nodemap);
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_GET_NODEMAP, 0, data,
ctdb, &outdata, &res);
return -1;
}
- nodemap->num = ((uint32_t *)outdata.dptr)[0];
- nodemap->nodes=talloc_array(mem_ctx, struct ctdb_node_and_flags, nodemap->num);
- CTDB_NO_MEMORY(ctdb, nodemap->nodes);
-
- for (i=0;i<nodemap->num;i++) {
- nodemap->nodes[i].vnn = ((uint32_t *)outdata.dptr)[2*i+1];
- nodemap->nodes[i].flags = ((uint32_t *)outdata.dptr)[2*i+2];
+ if (*nodemap) {
+ talloc_free(*nodemap);
+ *nodemap = NULL;
}
+ *nodemap = (struct ctdb_node_map *)talloc_memdup(mem_ctx, outdata.dptr, outdata.dsize);
return 0;
}
uint32_t *ctdb_get_connected_nodes(struct ctdb_context *ctdb, TALLOC_CTX *mem_ctx,
uint32_t *num_nodes)
{
- struct ctdb_node_map *map;
+ struct ctdb_node_map *map=NULL;
int ret, i;
uint32_t *nodes;
*num_nodes = 0;
- map = talloc(mem_ctx, struct ctdb_node_map);
- CTDB_NO_MEMORY_VOID(ctdb, map);
-
- ret = ctdb_ctrl_getnodemap(ctdb, CTDB_CURRENT_NODE, map, map);
+ ret = ctdb_ctrl_getnodemap(ctdb, CTDB_CURRENT_NODE, mem_ctx, &map);
if (ret != 0) {
- talloc_free(map);
return NULL;
}
nodes = talloc_array(mem_ctx, uint32_t, map->num);
if (nodes == NULL) {
- talloc_free(map);
return NULL;
}
}
}
- talloc_free(map);
return nodes;
}
{
uint32_t vnn, num_nodes, generation, dmaster;
struct ctdb_vnn_map *vnnmap;
- struct ctdb_node_map nodemap;
+ struct ctdb_node_map *nodemap=NULL;
int i, j, ret;
struct ctdb_dbid_map *dbmap=NULL;
/* 2: count the active nodes */
printf("\n2: count number of active nodes\n");
num_nodes = 0;
- for (i=0; i<nodemap.num; i++) {
- if (nodemap.nodes[i].flags&NODE_FLAGS_CONNECTED) {
+ for (i=0; i<nodemap->num; i++) {
+ if (nodemap->nodes[i].flags&NODE_FLAGS_CONNECTED) {
num_nodes++;
}
}
/* 3: go to all active nodes and activate recovery mode */
printf("\n3: set recovery mode for all active nodes\n");
- for (j=0; j<nodemap.num; j++) {
+ for (j=0; j<nodemap->num; j++) {
/* dont change it for nodes that are unavailable */
- if (!(nodemap.nodes[j].flags&NODE_FLAGS_CONNECTED)) {
+ if (!(nodemap->nodes[j].flags&NODE_FLAGS_CONNECTED)) {
continue;
}
- printf("setting node %d to recovery mode\n",nodemap.nodes[j].vnn);
- ret = ctdb_ctrl_setrecmode(ctdb, nodemap.nodes[j].vnn, CTDB_RECOVERY_ACTIVE);
+ printf("setting node %d to recovery mode\n",nodemap->nodes[j].vnn);
+ ret = ctdb_ctrl_setrecmode(ctdb, nodemap->nodes[j].vnn, CTDB_RECOVERY_ACTIVE);
if (ret != 0) {
- printf("Unable to set recmode on node %u\n", nodemap.nodes[j].vnn);
+ printf("Unable to set recmode on node %u\n", nodemap->nodes[j].vnn);
return ret;
}
}
printf("\n5: merge all records from remote nodes\n");
for (i=0;i<dbmap->num;i++) {
printf("recovering database 0x%08x\n",dbmap->dbids[i]);
- for (j=0; j<nodemap.num; j++) {
+ for (j=0; j<nodemap->num; j++) {
/* we dont need to merge with ourselves */
- if (nodemap.nodes[j].vnn == vnn) {
+ if (nodemap->nodes[j].vnn == vnn) {
continue;
}
/* dont merge from nodes that are unavailable */
- if (!(nodemap.nodes[j].flags&NODE_FLAGS_CONNECTED)) {
+ if (!(nodemap->nodes[j].flags&NODE_FLAGS_CONNECTED)) {
continue;
}
- printf("merging all records from node %d for database 0x%08x\n", nodemap.nodes[j].vnn, dbmap->dbids[i]);
- ret = ctdb_ctrl_copydb(ctdb, nodemap.nodes[j].vnn, vnn, dbmap->dbids[i], CTDB_LMASTER_ANY, ctdb);
+ printf("merging all records from node %d for database 0x%08x\n", nodemap->nodes[j].vnn, dbmap->dbids[i]);
+ ret = ctdb_ctrl_copydb(ctdb, nodemap->nodes[j].vnn, vnn, dbmap->dbids[i], CTDB_LMASTER_ANY, ctdb);
if (ret != 0) {
- printf("Unable to copy db from node %u to node %u\n", nodemap.nodes[j].vnn, vnn);
+ printf("Unable to copy db from node %u to node %u\n", nodemap->nodes[j].vnn, vnn);
return ret;
}
}
dmaster = vnn;
printf("new dmaster is %d\n", dmaster);
for (i=0;i<dbmap->num;i++) {
- for (j=0; j<nodemap.num; j++) {
+ for (j=0; j<nodemap->num; j++) {
/* dont repoint nodes that are unavailable */
- if (!(nodemap.nodes[j].flags&NODE_FLAGS_CONNECTED)) {
+ if (!(nodemap->nodes[j].flags&NODE_FLAGS_CONNECTED)) {
continue;
}
- printf("setting dmaster to %d for node %d db 0x%08x\n",dmaster,nodemap.nodes[j].vnn,dbmap->dbids[i]);
- ret = ctdb_ctrl_setdmaster(ctdb, nodemap.nodes[j].vnn, ctdb, dbmap->dbids[i], dmaster);
+ printf("setting dmaster to %d for node %d db 0x%08x\n",dmaster,nodemap->nodes[j].vnn,dbmap->dbids[i]);
+ ret = ctdb_ctrl_setdmaster(ctdb, nodemap->nodes[j].vnn, ctdb, dbmap->dbids[i], dmaster);
if (ret != 0) {
- printf("Unable to set dmaster for node %u db:0x%08x\n", nodemap.nodes[j].vnn, dbmap->dbids[i]);
+ printf("Unable to set dmaster for node %u db:0x%08x\n", nodemap->nodes[j].vnn, dbmap->dbids[i]);
return ret;
}
}
printf("\n7: push all records to remote nodes\n");
for (i=0;i<dbmap->num;i++) {
printf("distributing new database 0x%08x\n",dbmap->dbids[i]);
- for (j=0; j<nodemap.num; j++) {
+ for (j=0; j<nodemap->num; j++) {
/* we dont need to push to ourselves */
- if (nodemap.nodes[j].vnn == vnn) {
+ if (nodemap->nodes[j].vnn == vnn) {
continue;
}
/* dont push to nodes that are unavailable */
- if (!(nodemap.nodes[j].flags&NODE_FLAGS_CONNECTED)) {
+ if (!(nodemap->nodes[j].flags&NODE_FLAGS_CONNECTED)) {
continue;
}
- printf("pushing all records to node %d for database 0x%08x\n", nodemap.nodes[j].vnn, dbmap->dbids[i]);
- ret = ctdb_ctrl_copydb(ctdb, vnn, nodemap.nodes[j].vnn, dbmap->dbids[i], CTDB_LMASTER_ANY, ctdb);
+ printf("pushing all records to node %d for database 0x%08x\n", nodemap->nodes[j].vnn, dbmap->dbids[i]);
+ ret = ctdb_ctrl_copydb(ctdb, vnn, nodemap->nodes[j].vnn, dbmap->dbids[i], CTDB_LMASTER_ANY, ctdb);
if (ret != 0) {
- printf("Unable to copy db from node %u to node %u\n", vnn, nodemap.nodes[j].vnn);
+ printf("Unable to copy db from node %u to node %u\n", vnn, nodemap->nodes[j].vnn);
return ret;
}
}
generation = random();
vnnmap->generation = generation;
vnnmap->size = num_nodes;
- for (i=j=0;i<nodemap.num;i++) {
- if (nodemap.nodes[i].flags&NODE_FLAGS_CONNECTED) {
- vnnmap->map[j++]=nodemap.nodes[i].vnn;
+ for (i=j=0;i<nodemap->num;i++) {
+ if (nodemap->nodes[i].flags&NODE_FLAGS_CONNECTED) {
+ vnnmap->map[j++]=nodemap->nodes[i].vnn;
}
}
printf("Generation:%d\n",vnnmap->generation);
/* 9: push the new vnn map out to all the nodes */
printf("\n9: distribute the new vnn map\n");
- for (j=0; j<nodemap.num; j++) {
+ for (j=0; j<nodemap->num; j++) {
/* dont push to nodes that are unavailable */
- if (!(nodemap.nodes[j].flags&NODE_FLAGS_CONNECTED)) {
+ if (!(nodemap->nodes[j].flags&NODE_FLAGS_CONNECTED)) {
continue;
}
- printf("setting new vnn map on node %d\n",nodemap.nodes[j].vnn);
- ret = ctdb_ctrl_setvnnmap(ctdb, nodemap.nodes[j].vnn, ctdb, vnnmap);
+ printf("setting new vnn map on node %d\n",nodemap->nodes[j].vnn);
+ ret = ctdb_ctrl_setvnnmap(ctdb, nodemap->nodes[j].vnn, ctdb, vnnmap);
if (ret != 0) {
printf("Unable to set vnnmap for node %u\n", vnn);
return ret;
/* 10: disable recovery mode */
printf("\n10: restore recovery mode back to normal\n");
- for (j=0; j<nodemap.num; j++) {
+ for (j=0; j<nodemap->num; j++) {
/* dont push to nodes that are unavailable */
- if (!(nodemap.nodes[j].flags&NODE_FLAGS_CONNECTED)) {
+ if (!(nodemap->nodes[j].flags&NODE_FLAGS_CONNECTED)) {
continue;
}
- printf("changing recovery mode back to normal for node %d\n",nodemap.nodes[j].vnn);
- ret = ctdb_ctrl_setrecmode(ctdb, nodemap.nodes[j].vnn, CTDB_RECOVERY_NORMAL);
+ printf("changing recovery mode back to normal for node %d\n",nodemap->nodes[j].vnn);
+ ret = ctdb_ctrl_setrecmode(ctdb, nodemap->nodes[j].vnn, CTDB_RECOVERY_NORMAL);
if (ret != 0) {
- printf("Unable to set recmode on node %u\n", nodemap.nodes[j].vnn);
+ printf("Unable to set recmode on node %u\n", nodemap->nodes[j].vnn);
return ret;
}
}
{
uint32_t vnn;
int i, ret;
- struct ctdb_node_map *nodemap;
+ struct ctdb_node_map *nodemap=NULL;
if (argc < 1) {
usage();
vnn = strtoul(argv[0], NULL, 0);
- nodemap = talloc_zero(ctdb, struct ctdb_node_map);
- ret = ctdb_ctrl_getnodemap(ctdb, vnn, nodemap, nodemap);
+ ret = ctdb_ctrl_getnodemap(ctdb, vnn, ctdb, &nodemap);
if (ret != 0) {
printf("Unable to get nodemap from node %u\n", vnn);
- talloc_free(nodemap);
return ret;
}
"CONNECTED":"UNAVAILABLE",
nodemap->nodes[i].vnn==vnn?" (THIS NODE)":"");
}
- talloc_free(nodemap);
+
return 0;
}