From: Andrew Tridgell Date: Wed, 9 May 2007 22:13:19 +0000 (+1000) Subject: separate the wire format and internal format for the vnn_map X-Git-Tag: tevent-0.9.20~348^2~2763 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=682df74d59bf3f0c8606f21d9ca8b3795b2adc97;p=thirdparty%2Fsamba.git separate the wire format and internal format for the vnn_map (This used to be ctdb commit 9a71718d87c5162f1423d85c2e86a01f6771925e) --- diff --git a/ctdb/common/ctdb.c b/ctdb/common/ctdb.c index a7084d1a34c..cf4e7578985 100644 --- a/ctdb/common/ctdb.c +++ b/ctdb/common/ctdb.c @@ -161,15 +161,16 @@ XXX Once we have recovery working we should initialize this always to 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;ivnn_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;ivnn_map->size;i++) { + ctdb->vnn_map->map[i] = i; } talloc_free(lines); diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c index 02ad4c2d0e2..eeff60d405f 100644 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@ -808,6 +808,7 @@ int ctdb_ctrl_getvnnmap(struct ctdb_context *ctdb, struct timeval timeout, uint3 int ret; TDB_DATA data, outdata; int32_t res; + struct ctdb_vnn_map_wire *map; ZERO_STRUCT(data); ret = ctdb_control(ctdb, destnode, 0, @@ -817,8 +818,22 @@ int ctdb_ctrl_getvnnmap(struct ctdb_context *ctdb, struct timeval timeout, uint3 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; } diff --git a/ctdb/common/ctdb_recover.c b/ctdb/common/ctdb_recover.c index a45180d94ef..fd63667dbec 100644 --- a/ctdb/common/ctdb_recover.c +++ b/ctdb/common/ctdb_recover.c @@ -32,9 +32,19 @@ int 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; } diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 3ade8e714b2..0b627458106 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -190,6 +190,15 @@ struct ctdb_status { /* 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]; diff --git a/ctdb/tests/ctdbd.sh b/ctdb/tests/ctdbd.sh index 1664a68d639..104bb717877 100755 --- a/ctdb/tests/ctdbd.sh +++ b/ctdb/tests/ctdbd.sh @@ -31,4 +31,6 @@ $VALGRIND bin/ctdb_control attach test2.tdb || exit 1 echo "Testing getdbmap" $VALGRIND bin/ctdb_control getdbmap 0 || exit 1 +echo "All done" + killall -q ctdbd