]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
add a new control : SETVNNMAP to set the generation id and also the vnn
authorRonnie Sahlberg <sahlberg@ronnie>
Fri, 27 Apr 2007 12:08:12 +0000 (22:08 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Fri, 27 Apr 2007 12:08:12 +0000 (22:08 +1000)
map on a ctdbd daemon

(This used to be ctdb commit f55707885f7b233ad6ddfc952d08851577063200)

ctdb/common/ctdb_client.c
ctdb/common/ctdb_control.c
ctdb/include/ctdb.h
ctdb/include/ctdb_private.h
ctdb/tools/ctdb_control.c

index 0957956cece6dbc4a24b5f0448650758b71fd2d5..56e10322997b3e93eede89dec9928ea0093c3d17 100644 (file)
@@ -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;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
  */
index 1f296945242709a0e544ee0ceb5045c6758078ab..9d6a0469dc1dfe28f85388503325378a33d1719d 100644 (file)
@@ -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;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);
index 3d252ef4d7495b0e18ccb21e89b26dba73e49113..9b7484b037b8ff7db0fdd93ce4132c660dc82a4f 100644 (file)
@@ -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);
 
index 658c0436d3a833c1656a78ab83279402845a9aa5..dfa642ae9f5f0ad380d85d61972217f0afe8cab0 100644 (file)
@@ -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};
 
index 378b7b6ec880b47db7faeba2edbc74201ea187dc..c1616878a15629bf9d4ae2df41f5243be716ae00 100644 (file)
@@ -37,6 +37,7 @@ static void usage(void)
        printf("  process-exists <vnn:pid>\n");
        printf("  status <vnn>\n");
        printf("  getvnnmap <vnn>\n");
+       printf("  setvnnmap <vnn> <generation> <numslots> <lmaster>*\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;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;
@@ -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 {