add a mapping table from a hash value to a lmaster vnn number
authorRonnie Sahlberg <sahlberg@ronnie>
Fri, 27 Apr 2007 08:43:52 +0000 (18:43 +1000)
committerRonnie Sahlberg <sahlberg@ronnie>
Fri, 27 Apr 2007 08:43:52 +0000 (18:43 +1000)
update ctdb_lmaster() return the lmaster based on this tables contents

initialize the vnn table based on number of nodes for now.
later when recovery is implemented the recovery process will populate
this mapping table.

(This used to be ctdb commit 71e440f6c26ea074f9887237c962101c8cef8c80)

ctdb/common/cmdline.c
ctdb/common/ctdb_daemon.c
ctdb/common/ctdb_ltdb.c
ctdb/include/ctdb_private.h

index 2b9d5f43c6bf9bc264720ddba783cf4176a47cbd..988fee81e84e4be354030d1d33f978a3c945a5bc 100644 (file)
@@ -66,7 +66,7 @@ struct poptOption popt_ctdb_cmdline[] = {
 struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
 {
        struct ctdb_context *ctdb;
-       int ret;
+       int i, ret;
 
        if (ctdb_cmdline.nlist == NULL || ctdb_cmdline.myaddress == NULL) {
                printf("You must provide a node list with --nlist and an address with --listen\n");
@@ -120,6 +120,31 @@ struct ctdb_context *ctdb_cmdline_init(struct event_context *ev)
                exit(1);
        }
 
+       /* initialize the vnn mapping table */
+/*
+XXX we currently initialize it to the maximum number of nodes to 
+XXX make it behave the same way as previously.  
+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(ctdb, struct ctdb_vnn_map);
+       if (ctdb->vnn_map == NULL) {
+               DEBUG(0,(__location__ " Unable to allocate vnn_map structure\n"));
+               exit(1);
+       }
+       ctdb->vnn_map->generation = 1;
+       ctdb->vnn_map->size = 1024;
+       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] = i%ctdb->num_nodes;
+       }
+
+
        return ctdb;
 }
 
index e61c7351b6bc3446f6fc90bf59a8b23d978aafe5..0e810a0b2ebfc63de6d285599170b69209689141 100644 (file)
@@ -678,6 +678,7 @@ int ctdb_start(struct ctdb_context *ctdb)
        
        close(fd[1]);
 
+
        ctdb->ev = event_context_init(NULL);
        fde = event_add_fd(ctdb->ev, ctdb, fd[0], EVENT_FD_READ, ctdb_read_from_parent, &fd[0]);
        fde = event_add_fd(ctdb->ev, ctdb, ctdb->daemon.sd, EVENT_FD_READ, ctdb_accept_client, ctdb);
index e604f913b15f69fd92b5ebc9de3740ce5499c31f..6606ea1f31f08e8311f4a04a413d73dafa00909a 100644 (file)
@@ -124,7 +124,12 @@ struct ctdb_db_context *ctdb_attach(struct ctdb_context *ctdb, const char *name,
 */
 uint32_t ctdb_lmaster(struct ctdb_context *ctdb, const TDB_DATA *key)
 {
-       return ctdb_hash(key) % ctdb->num_nodes;
+       uint32_t idx, lmaster;
+
+       idx = ctdb_hash(key) % ctdb->vnn_map->size;
+       lmaster = ctdb->vnn_map->map[idx];
+
+       return lmaster;
 }
 
 
index 5f28c6370085bf9e9a5843c80804d8d15268ec4a..2176afc2524fe5f018f9c8d8847ad1a8eb1198a3 100644 (file)
@@ -157,6 +157,14 @@ struct ctdb_status {
        double max_lockwait_latency;
 };
 
+/* table that contains the mapping between a hash value and lmaster
+ */
+struct ctdb_vnn_map {
+       uint32_t generation;
+       uint32_t size;
+       uint32_t *map;
+};
+
 /* main state of the ctdb daemon */
 struct ctdb_context {
        struct event_context *ev;
@@ -181,6 +189,7 @@ struct ctdb_context {
        struct ctdb_message_list *message_list;
        struct ctdb_daemon_data daemon;
        struct ctdb_status status;
+       struct ctdb_vnn_map *vnn_map;
 };
 
 struct ctdb_db_context {