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;i<vnnmap->size;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
*/
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;i<ctdb->vnn_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);
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);
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};
printf(" process-exists <vnn:pid>\n");
printf(" status <vnn>\n");
printf(" getvnnmap <vnn>\n");
+ printf(" setvnnmap <vnn> <generation> <numslots> <lmaster>*\n");
exit(1);
}
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;i<vnnmap->size;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;
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 {