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");
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;
}
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);
*/
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;
}
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;
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 {