XXX generation==0 (==invalid) and let the recovery tool populate this
XXX table for the daemons.
*/
- ctdb->vnn_map = talloc_zero_size(ctdb, offsetof(struct ctdb_vnn_map, map) + 4*ctdb->num_nodes);
- if (ctdb->vnn_map == NULL) {
- DEBUG(0,(__location__ " Unable to allocate vnn_map structure\n"));
- exit(1);
- }
+ ctdb->vnn_map = talloc(ctdb, struct ctdb_vnn_map);
+ CTDB_NO_MEMORY(ctdb, ctdb->vnn_map);
+
ctdb->vnn_map->generation = 1;
ctdb->vnn_map->size = ctdb->num_nodes;
- for(i=0;i<ctdb->vnn_map->size;i++){
- ctdb->vnn_map->map[i] = i%ctdb->num_nodes;
+ ctdb->vnn_map->map = talloc_array(ctdb->vnn_map, uint32_t, ctdb->vnn_map->size);
+ CTDB_NO_MEMORY(ctdb, ctdb->vnn_map->map);
+
+ for(i=0;i<ctdb->vnn_map->size;i++) {
+ ctdb->vnn_map->map[i] = i;
}
talloc_free(lines);
int ret;
TDB_DATA data, outdata;
int32_t res;
+ struct ctdb_vnn_map_wire *map;
ZERO_STRUCT(data);
ret = ctdb_control(ctdb, destnode, 0,
DEBUG(0,(__location__ " ctdb_control for getvnnmap failed\n"));
return -1;
}
+
+ map = (struct ctdb_vnn_map_wire *)outdata.dptr;
+ if (outdata.dsize < offsetof(struct ctdb_vnn_map_wire, map) ||
+ outdata.dsize != map->size*sizeof(uint32_t) + offsetof(struct ctdb_vnn_map_wire, map)) {
+ DEBUG(0,("Bad vnn map size received in ctdb_ctrl_getvnnmap\n"));
+ return -1;
+ }
+
+ (*vnnmap) = talloc(mem_ctx, struct ctdb_vnn_map);
+ CTDB_NO_MEMORY(ctdb, *vnnmap);
+ (*vnnmap)->generation = map->generation;
+ (*vnnmap)->size = map->size;
+ (*vnnmap)->map = talloc_array(*vnnmap, uint32_t, map->size);
- *vnnmap = (struct ctdb_vnn_map *)talloc_memdup(mem_ctx, outdata.dptr, outdata.dsize);
+ CTDB_NO_MEMORY(ctdb, (*vnnmap)->map);
+ memcpy((*vnnmap)->map, map->map, sizeof(uint32_t)*map->size);
return 0;
}
ctdb_control_getvnnmap(struct ctdb_context *ctdb, uint32_t opcode, TDB_DATA indata, TDB_DATA *outdata)
{
CHECK_CONTROL_DATA_SIZE(0);
+ struct ctdb_vnn_map_wire *map;
+ size_t len;
- outdata->dsize = offsetof(struct ctdb_vnn_map, map) + 4*ctdb->vnn_map->size;
- outdata->dptr = (unsigned char *)ctdb->vnn_map;
+ len = offsetof(struct ctdb_vnn_map_wire, map) + sizeof(uint32_t)*ctdb->vnn_map->size;
+ map = talloc_size(outdata, len);
+ CTDB_NO_MEMORY_VOID(ctdb, map);
+
+ map->generation = ctdb->vnn_map->generation;
+ map->size = ctdb->vnn_map->size;
+ memcpy(map->map, ctdb->vnn_map->map, sizeof(uint32_t)*map->size);
+
+ outdata->dsize = len;
+ outdata->dptr = (uint8_t *)map;
return 0;
}
/* table that contains the mapping between a hash value and lmaster
*/
struct ctdb_vnn_map {
+ uint32_t generation;
+ uint32_t size;
+ uint32_t *map;
+};
+
+/*
+ a wire representation of the vnn map
+ */
+struct ctdb_vnn_map_wire {
uint32_t generation;
uint32_t size;
uint32_t map[1];
echo "Testing getdbmap"
$VALGRIND bin/ctdb_control getdbmap 0 || exit 1
+echo "All done"
+
killall -q ctdbd