From: Ronnie Sahlberg Date: Fri, 27 Apr 2007 12:08:12 +0000 (+1000) Subject: add a new control : SETVNNMAP to set the generation id and also the vnn X-Git-Tag: tevent-0.9.20~348^2~2832^2 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=d4c54a93a0b21da9ed9241cf283392b7591b52a1;p=thirdparty%2Fsamba.git add a new control : SETVNNMAP to set the generation id and also the vnn map on a ctdbd daemon (This used to be ctdb commit f55707885f7b233ad6ddfc952d08851577063200) --- diff --git a/ctdb/common/ctdb_client.c b/ctdb/common/ctdb_client.c index 0957956cece..56e10322997 100644 --- a/ctdb/common/ctdb_client.c +++ b/ctdb/common/ctdb_client.c @@ -813,6 +813,38 @@ int ctdb_getvnnmap(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_vnn return 0; } + +/* + set vnn map on a node + */ +int ctdb_setvnnmap(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_vnn_map *vnnmap) +{ + int ret; + TDB_DATA *data, outdata; + int32_t i, res; + + data = talloc_zero(ctdb, TDB_DATA); + data->dsize = (vnnmap->size+2)*sizeof(uint32_t); + data->dptr = (unsigned char *)talloc_array(data, uint32_t, vnnmap->size+2); + + ((uint32_t *)&data->dptr[0])[0] = vnnmap->generation; + ((uint32_t *)&data->dptr[0])[1] = vnnmap->size; + for (i=0;isize;i++) { + ((uint32_t *)&data->dptr[0])[i+2] = vnnmap->map[i]; + } + + ret = ctdb_control(ctdb, destnode, 0, + CTDB_CONTROL_SETVNNMAP, *data, + ctdb, &outdata, &res); + if (ret != 0 || res != 0) { + DEBUG(0,(__location__ " ctdb_control for setvnnmap failed\n")); + return -1; + } + + talloc_free(data); + return 0; +} + /* ping a node */ diff --git a/ctdb/common/ctdb_control.c b/ctdb/common/ctdb_control.c index 1f296945242..9d6a0469dc1 100644 --- a/ctdb/common/ctdb_control.c +++ b/ctdb/common/ctdb_control.c @@ -73,6 +73,27 @@ static int32_t ctdb_control_dispatch(struct ctdb_context *ctdb, return 0; } + case CTDB_CONTROL_SETVNNMAP: { + uint32_t *ptr, i; + + ptr = (uint32_t *)(&indata.dptr[0]); + ctdb->vnn_map->generation = ptr[0]; + ctdb->vnn_map->size = ptr[1]; + if (ctdb->vnn_map->map) { + talloc_free(ctdb->vnn_map->map); + ctdb->vnn_map->map = NULL; + } + ctdb->vnn_map->map = talloc_array(ctdb->vnn_map, uint32_t, ctdb->vnn_map->size); + if (ctdb->vnn_map->map == NULL) { + DEBUG(0,(__location__ " Unable to allocate vnn_map->map structure\n")); + exit(1); + } + for (i=0;ivnn_map->size;i++) { + ctdb->vnn_map->map[i] = ptr[i+2]; + } + return 0; + } + case CTDB_CONTROL_CONFIG: { outdata->dptr = (uint8_t *)ctdb; outdata->dsize = sizeof(*ctdb); diff --git a/ctdb/include/ctdb.h b/ctdb/include/ctdb.h index 3d252ef4d74..9b7484b037b 100644 --- a/ctdb/include/ctdb.h +++ b/ctdb/include/ctdb.h @@ -217,6 +217,7 @@ int ctdb_status(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_status struct ctdb_vnn_map; int ctdb_getvnnmap(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_vnn_map *vnnmap); +int ctdb_setvnnmap(struct ctdb_context *ctdb, uint32_t destnode, struct ctdb_vnn_map *vnnmap); int ctdb_getdbpath(struct ctdb_db_context *ctdb_db, TALLOC_CTX *mem_ctx, const char **path); diff --git a/ctdb/include/ctdb_private.h b/ctdb/include/ctdb_private.h index 658c0436d3a..dfa642ae9f5 100644 --- a/ctdb/include/ctdb_private.h +++ b/ctdb/include/ctdb_private.h @@ -244,7 +244,8 @@ enum ctdb_controls {CTDB_CONTROL_PROCESS_EXISTS, CTDB_CONTROL_CONFIG, CTDB_CONTROL_PING, CTDB_CONTROL_GETDBPATH, - CTDB_CONTROL_GETVNNMAP}; + CTDB_CONTROL_GETVNNMAP, + CTDB_CONTROL_SETVNNMAP}; enum call_state {CTDB_CALL_WAIT, CTDB_CALL_DONE, CTDB_CALL_ERROR}; diff --git a/ctdb/tools/ctdb_control.c b/ctdb/tools/ctdb_control.c index 378b7b6ec88..c1616878a15 100644 --- a/ctdb/tools/ctdb_control.c +++ b/ctdb/tools/ctdb_control.c @@ -37,6 +37,7 @@ static void usage(void) printf(" process-exists \n"); printf(" status \n"); printf(" getvnnmap \n"); + printf(" setvnnmap *\n"); exit(1); } @@ -142,6 +143,33 @@ static int control_getvnnmap(struct ctdb_context *ctdb, int argc, const char **a return 0; } +static int control_setvnnmap(struct ctdb_context *ctdb, int argc, const char **argv) +{ + uint32_t vnn; + struct ctdb_vnn_map *vnnmap; + int i, ret; + if (argc < 3) { + usage(); + } + + vnn = strtoul(argv[0], NULL, 0); + + vnnmap = talloc_zero(ctdb, struct ctdb_vnn_map); + vnnmap->generation = strtoul(argv[1], NULL, 0); + vnnmap->size = strtoul(argv[2], NULL, 0); + vnnmap->map = talloc_array(vnnmap, uint32_t, vnnmap->size); + for (i=0;isize;i++) { + vnnmap->map[i] = strtoul(argv[3+i], NULL, 0); + } + + ret = ctdb_setvnnmap(ctdb, vnn, vnnmap); + if (ret != 0) { + printf("Unable to set vnnmap for node %u\n", vnn); + return ret; + } + return 0; +} + static int control_ping(struct ctdb_context *ctdb, int argc, const char **argv) { int ret, i; @@ -217,6 +245,8 @@ int main(int argc, const char *argv[]) ret = control_status(ctdb, extra_argc-1, extra_argv+1); } else if (strcmp(control, "getvnnmap") == 0) { ret = control_getvnnmap(ctdb, extra_argc-1, extra_argv+1); + } else if (strcmp(control, "setvnnmap") == 0) { + ret = control_setvnnmap(ctdb, extra_argc-1, extra_argv+1); } else if (strcmp(control, "ping") == 0) { ret = control_ping(ctdb, extra_argc-1, extra_argv+1); } else {