/*
get a list of databases off a remote node
*/
--int ctdb_ctrl_getdbmap(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, struct ctdb_dbid_map *dbmap)
++int ctdb_ctrl_getdbmap(struct ctdb_context *ctdb, uint32_t destnode, TALLOC_CTX *mem_ctx, struct ctdb_dbid_map **dbmap)
{
int ret;
TDB_DATA data, outdata;
-- int32_t i, res;
++ int32_t res;
ZERO_STRUCT(data);
ret = ctdb_control(ctdb, destnode, 0,
CTDB_CONTROL_GET_DBMAP, 0, data,
ctdb, &outdata, &res);
if (ret != 0 || res != 0) {
-- DEBUG(0,(__location__ " ctdb_control for getvnnmap failed\n"));
++ DEBUG(0,(__location__ " ctdb_control for getdbmap failed\n"));
return -1;
}
-- dbmap->num = ((uint32_t *)outdata.dptr)[0];
-- dbmap->dbids=talloc_array(mem_ctx, uint32_t, dbmap->num);
-- if (!dbmap->dbids) {
-- DEBUG(0,(__location__ " failed to talloc dbmap\n"));
-- return -1;
-- }
-- for (i=0;i<dbmap->num;i++) {
-- dbmap->dbids[i] = ((uint32_t *)outdata.dptr)[i+1];
++ if (*dbmap) {
++ talloc_free(*dbmap);
++ *dbmap = NULL;
}
++ *dbmap = (struct ctdb_dbid_map *)talloc_memdup(mem_ctx, outdata.dptr, outdata.dsize);
return 0;
}
case CTDB_CONTROL_GETVNNMAP:
return ctdb_control_getvnnmap(ctdb, opcode, indata, outdata);
-- case CTDB_CONTROL_GET_DBMAP: {
-- uint32_t i, len;
-- struct ctdb_db_context *ctdb_db;
--
-- CHECK_CONTROL_DATA_SIZE(0);
-- len = 0;
-- for(ctdb_db=ctdb->db_list;ctdb_db;ctdb_db=ctdb_db->next){
-- len++;
-- }
--
-- outdata->dsize = (len+1)*sizeof(uint32_t);
-- outdata->dptr = (unsigned char *)talloc_array(outdata, uint32_t, len+1);
-- if (!outdata->dptr) {
-- DEBUG(0, (__location__ "Failed to allocate dbmap array\n"));
-- exit(1);
-- }
--
-- ((uint32_t *)outdata->dptr)[0] = len;
-- for(i=0,ctdb_db=ctdb->db_list;ctdb_db;i++,ctdb_db=ctdb_db->next){
-- ((uint32_t *)outdata->dptr)[i+1] = ctdb_db->db_id;
-- }
--
-- return 0;
-- }
++ case CTDB_CONTROL_GET_DBMAP:
++ return ctdb_control_getdbmap(ctdb, opcode, indata, outdata);
case CTDB_CONTROL_GET_NODEMAP: {
uint32_t num_nodes, i, len;
struct ctdb_vnn_map *vnnmap;
struct ctdb_node_map nodemap;
int i, j, ret;
-- struct ctdb_dbid_map dbmap;
++ struct ctdb_dbid_map *dbmap=NULL;
if (argc < 1) {
usage();
printf("Unable to get dbids from node %u\n", vnn);
return ret;
}
-- for (i=0;i<dbmap.num;i++) {
++ for (i=0;i<dbmap->num;i++) {
const char *path;
-- ctdb_ctrl_getdbpath(ctdb, dbmap.dbids[i], ctdb, &path);
-- printf("dbid:0x%08x path:%s\n", dbmap.dbids[i], path);
++ ctdb_ctrl_getdbpath(ctdb, dbmap->dbids[i], ctdb, &path);
++ printf("dbid:0x%08x path:%s\n", dbmap->dbids[i], path);
}
/* 5: pull all records from all other nodes across to this node
(this merges based on rsn internally)
*/
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 (i=0;i<dbmap->num;i++) {
++ printf("recovering database 0x%08x\n",dbmap->dbids[i]);
for (j=0; j<nodemap.num; j++) {
/* we dont need to merge with ourselves */
if (nodemap.nodes[j].vnn == vnn) {
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);
return ret;
printf("\n6: repoint dmaster to the recovery node\n");
dmaster = vnn;
printf("new dmaster is %d\n", dmaster);
-- for (i=0;i<dbmap.num;i++) {
++ for (i=0;i<dbmap->num;i++) {
for (j=0; j<nodemap.num; j++) {
/* dont repoint nodes that are unavailable */
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;
}
}
/* 7: push all records out to the nodes again */
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 (i=0;i<dbmap->num;i++) {
++ printf("distributing new database 0x%08x\n",dbmap->dbids[i]);
for (j=0; j<nodemap.num; j++) {
/* we dont need to push to ourselves */
if (nodemap.nodes[j].vnn == vnn) {
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);
return ret;
{
uint32_t vnn;
int i, ret;
-- struct ctdb_dbid_map dbmap;
++ struct ctdb_dbid_map *dbmap=NULL;
if (argc < 1) {
usage();
return ret;
}
-- printf("Number of databases:%d\n", dbmap.num);
-- for(i=0;i<dbmap.num;i++){
++ printf("Number of databases:%d\n", dbmap->num);
++ for(i=0;i<dbmap->num;i++){
const char *path;
-- ctdb_ctrl_getdbpath(ctdb, dbmap.dbids[i], ctdb, &path);
-- printf("dbid:0x%08x path:%s\n", dbmap.dbids[i], path);
++ ctdb_ctrl_getdbpath(ctdb, dbmap->dbids[i], ctdb, &path);
++ printf("dbid:0x%08x path:%s\n", dbmap->dbids[i], path);
}
return 0;