List:Commits« Previous MessageNext Message »
From:John David Duncan Date:April 6 2011 11:52pm
Subject:bzr commit into mysql-5.1-telco-7.2 branch (john.duncan:4152)
View as plain text  
#At file:///Users/jdd/bzr-repo/working/cluster-7.2-labs-memcached/ based on revid:john.duncan@stripped

 4152 John David Duncan	2011-04-06
      Use genhash instead of std::map in configuration.

    modified:
      storage/ndb/memcache/include/Configuration.h
      storage/ndb/memcache/src/Configuration.cc
=== modified file 'storage/ndb/memcache/include/Configuration.h'
--- a/storage/ndb/memcache/include/Configuration.h	2011-03-30 06:54:53 +0000
+++ b/storage/ndb/memcache/include/Configuration.h	2011-04-06 23:52:36 +0000
@@ -25,7 +25,6 @@
 #endif
 
 #include <string.h>
-#include <map>
 
 #include <NdbApi.hpp>
 
@@ -124,12 +123,6 @@ class Configuration {
 };
 
 
-/* strless is a function object used for std::map<char *, ...> */
-class strless {
-public: bool operator()(char *s1, char *s2) { return strcmp(s1, s2) < 0; };
-};
-
-
 class config_v0 {
 public:
   /* Methods */
@@ -161,16 +154,13 @@ private:
   void set_initial_cas();
   
   /* Private instance variables */
-  /* Uses std::map, but actually just needs an unordered hash table. */
   Configuration &conf;
   int server_role_id;
-  Uint64 signon_gci;
-  
-  std::map<int, int> cluster_ids;
-  std::map<int, int>::const_iterator cluster_ids_iterator;
-  std::map<char *, prefix_info_t, strless> policies;
-  std::map<char *, prefix_info_t, strless>::const_iterator policies_iterator;
-  genhash_t *containers;
+  Uint64 signon_gci;  
+  int nclusters;
+  int cluster_ids[MAX_CLUSTERS];
+  genhash_t *policies_map;
+  genhash_t *containers_map;
 };
 
 /* Inline methods */

=== modified file 'storage/ndb/memcache/src/Configuration.cc'
--- a/storage/ndb/memcache/src/Configuration.cc	2011-04-06 04:31:28 +0000
+++ b/storage/ndb/memcache/src/Configuration.cc	2011-04-06 23:52:36 +0000
@@ -385,7 +385,11 @@ bool config_v0::read_configuration() {
 bool config_v1::read_configuration() {
   DEBUG_ENTER();
 
-  containers = genhash_init(10, str_hash_ops);
+  nclusters = 0;
+  for(int i = 0 ; i < MAX_CLUSTERS ; i++) cluster_ids[i] = 0;
+
+  containers_map  = genhash_init(10, str_hash_ops);
+  policies_map    = genhash_init(10, str_dup_hash_ops);
   
   bool success = false;  
   server_role_id = get_server_role_id();
@@ -474,45 +478,45 @@ bool config_v1::get_policies() {
     success = false;
   }
   while((res = scan->nextResult((const char **) &op.buffer, true, false) == 0)) {
-    /* Add the policy to the internal map */
+    prefix_info_t * info = (prefix_info_t *) calloc(1, sizeof(prefix_info_t));
     
     char name[41];          //   `policy_name` VARCHAR(40) NOT NULL
     op.copyValue(COL_STORE_KEY, name);
-    prefix_info_t info = policies[strdup(name)];  /* copy the name  */
     
     /*  ENUM('cache_only','ndb_only','caching','disabled') NOT NULL 
         is:      1            2          3         4                   */
     unsigned int get_policy = op.getIntValue(COL_STORE_VALUE+0);
     assert((get_policy > 0) && (get_policy < 5));
-    if(get_policy == 1 || get_policy == 3) info.do_mc_read = 1; 
-    if(get_policy == 2 || get_policy == 3) info.do_db_read = 1; 
+    if(get_policy == 1 || get_policy == 3) info->do_mc_read = 1; 
+    if(get_policy == 2 || get_policy == 3) info->do_db_read = 1; 
       
     unsigned int set_policy = op.getIntValue(COL_STORE_VALUE+1);
     assert((set_policy > 0) && (set_policy < 5));
-    if(set_policy == 1 || set_policy == 3) info.do_mc_write = 1; 
-    if(set_policy == 2 || set_policy == 3) info.do_db_write = 1; 
+    if(set_policy == 1 || set_policy == 3) info->do_mc_write = 1; 
+    if(set_policy == 2 || set_policy == 3) info->do_db_write = 1; 
 
     unsigned int del_policy = op.getIntValue(COL_STORE_VALUE+2); 
     assert((del_policy > 0) && (del_policy < 5));
-    if(del_policy == 1 || del_policy == 3) info.do_mc_delete = 1;
-    if(del_policy == 2 || del_policy == 3) info.do_db_delete = 1;
+    if(del_policy == 1 || del_policy == 3) info->do_mc_delete = 1;
+    if(del_policy == 2 || del_policy == 3) info->do_db_delete = 1;
 
 
     /* `flush_from_db` ENUM('false', 'true') NOT NULL DEFAULT 'false' 
         is:                   1        2          */
     int flush_policy = op.getIntValue(COL_STORE_VALUE+3);
-    if(flush_policy == 2) info.do_db_flush = 1;
+    if(flush_policy == 2) info->do_db_flush = 1;
+    
+    DEBUG_PRINT("%s:  get-%d set-%d del-%d flush-%d addr-%p",
+                name, get_policy, set_policy, del_policy, flush_policy, info);
     
-    DEBUG_PRINT("%s:  get-%d set-%d del-%d flush-%d",
-                name, get_policy, set_policy, del_policy, flush_policy);
+    genhash_store(policies_map, name, strlen(name), info, sizeof(prefix_info_t *));
 
-    policies[name] = info;
   }
   if(res == -1) {
     logger->log(LOG_WARNING, 0, scan->getNdbError().message);
     success = false;
   }
-  DEBUG_PRINT("map size: %d", policies.size());
+  DEBUG_PRINT("map size: %d", genhash_size(policies_map));
   
   tx->close();
       
@@ -569,14 +573,14 @@ bool config_v1::get_connections() {
     DEBUG_PRINT("[%d]:  { %d => \"%s\" [rtt: %d]}", connection_idx, 
                 cfg_data_id, str_is_null ? "" : connectstring, rtt);
 
-    /* Add an item to the metadata_id => connection_index map */
-    cluster_ids[cfg_data_id] = connection_idx;
+    nclusters++;
+    cluster_ids[connection_idx] = cfg_data_id;
   }
   if(res == -1) {
     logger->log(LOG_WARNING, 0, scan->getNdbError().message);
     success = false;
   }
-  DEBUG_PRINT("map size: %d", cluster_ids.size());
+  DEBUG_PRINT("clusters: %d", nclusters);
   tx->close();
   return success;
 }
@@ -585,10 +589,10 @@ bool config_v1::get_connections() {
 TableSpec * config_v1::get_container(char *name) {
   TableSpec *c;
   
-  c = (TableSpec *) genhash_find(containers, name, strlen(name));
+  c = (TableSpec *) genhash_find(containers_map, name, strlen(name));
   if(c == NULL) {
     c = get_container_record(name);
-    genhash_store(containers, name, strlen(name), c, sizeof(TableSpec));
+    genhash_store(containers_map, name, strlen(name), c, sizeof(TableSpec));
   }
   else {
     DEBUG_PRINT("\"%s\" found in local map (\"%s\").", name, c->table_name);
@@ -770,16 +774,18 @@ bool config_v1::store_prefix(const char 
                              char *cache_policy) {
   DEBUG_PRINT("%s", name);
   KeyPrefix prefix(name);
-  
-  policies_iterator = policies.find(cache_policy);
-  if(policies_iterator == policies.end()) {
+  prefix_info_t * info_ptr;
+
+  info_ptr = (prefix_info_t *) genhash_find(policies_map, 
+                                            cache_policy, strlen(cache_policy));
+  if(info_ptr == 0) {  
     /* policy from key_prefixes doesn't exist in cache_policies */
     logger->log(LOG_WARNING, 0, "Invalid cache policy \"%s\" named in "
                 "key prefix \"%s\"\n", cache_policy, name);
     return false;
   }
   
-  prefix.info = (*policies_iterator).second;
+  memcpy(& prefix.info, info_ptr, sizeof(prefix_info_t));
   
   if(prefix.info.do_db_read || prefix.info.do_db_write
      || prefix.info.do_db_delete || prefix.info.do_db_flush) {
@@ -806,15 +812,20 @@ bool config_v1::store_prefix(const char 
   }
 
   /* The cluster_id must refer to a known cluster: */
-  cluster_ids_iterator = cluster_ids.find(cluster_id);
-  if(cluster_ids_iterator == cluster_ids.end()) {
+  int internal_cluster_idx = -1;
+  for(int i = 0 ; i < nclusters ; i++) 
+    if(cluster_ids[i] == cluster_id)
+      internal_cluster_idx = i;
+
+  if(internal_cluster_idx == -1) {
     logger->log(LOG_WARNING, 0, "Error at key prefix \"%s\": cluster_id %d "
-                "does not exist in ndb_clusters table.\n", name, cluster_id);
-    return false;
+                                "does not exist in ndb_clusters table.\n", 
+                                name, cluster_id);
+     return false;
   }  
-
+  
   /* Tie it all together */
-  prefix.info.cluster_id = (*cluster_ids_iterator).second;
+  prefix.info.cluster_id = internal_cluster_idx;
   prefix.table = table;
   prefix.info.usable = 1;
  
@@ -823,6 +834,7 @@ bool config_v1::store_prefix(const char 
   */
   prefix.info.prefix_id = conf.storePrefix(prefix);
 
+
   return true;
 }
 


Attachment: [text/bzr-bundle] bzr/john.duncan@oracle.com-20110406235236-74ipwbtbfv1dk9sc.bundle
Thread
bzr commit into mysql-5.1-telco-7.2 branch (john.duncan:4152) John David Duncan7 Apr