Coding style changes. Moved the srandom to memcached_behavior_set instead of doing...
authorMikko Koppanen <mkoppanen@gameboy.config>
Fri, 27 Nov 2009 19:46:16 +0000 (19:46 +0000)
committerMikko Koppanen <mkoppanen@gameboy.config>
Fri, 27 Nov 2009 19:46:16 +0000 (19:46 +0000)
docs/memcached_behavior.pod
libmemcached/memcached_behavior.c
libmemcached/memcached_get.c

index dd7184541743adf05d6dcdcbe15649db76ffb497..0288feb0807e7efd396d799b538e60b81f6c6d92 100644 (file)
@@ -209,6 +209,15 @@ This replication does not dedicate certain memcached servers to store the
 replicas in, but instead it will store the replicas together with all of the
 other objects (on the 'n' next servers specified in your server list).
 
+=item MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
+
+Allows randomizing the replica reads starting point. Normally the read is 
+done from primary server and in case of miss the read is done from primary
++ 1, then primary + 2 all the way to 'n' replicas. If this option is set 
+on the starting point of the replica reads is randomized between the servers.
+This allows distributing read load to multiple servers with the expense of 
+more write traffic.
+
 =back
 
 =head1 RETURN
index 7196a066e88e72177ee2d5ed3cc7607790638f65..4f462f99827cc854b03913aa32a3bfaf102055f8 100644 (file)
@@ -177,6 +177,7 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
     set_behavior_flag(ptr, MEM_AUTO_EJECT_HOSTS, data);
     break;
     case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ:
+      srandom((uint32_t) time(NULL));
       set_behavior_flag(ptr, MEM_RANDOMIZE_REPLICA_READ, data);
       break;
   default:
index 6c730093c9cd14d8407b36f7f6a2b6d45c15f551..0aa0f44c108d4e4ebe4dad8b1a5908201dc65427 100644 (file)
@@ -432,13 +432,11 @@ static memcached_return replication_binary_mget(memcached_st *ptr,
                                                 size_t number_of_keys)
 {
   memcached_return rc= MEMCACHED_NOTFOUND;
-  uint32_t x, start = 0;
-  uint64_t randomize_read = memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
+  uint32_t x, start= 0;
+  uint64_t randomize_read= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
 
-  if (randomize_read) {
-    srandom((uint32_t) time(NULL));
-    start = (uint32_t)(random() % (ptr->number_of_replicas + 1));
-  }
+  if (randomize_read) 
+    start= (uint32_t)(random() % (ptr->number_of_replicas + 1));
 
   /* Loop for each replica */
   for (uint32_t replica= 0; replica <= ptr->number_of_replicas; ++replica)
@@ -447,19 +445,14 @@ static memcached_return replication_binary_mget(memcached_st *ptr,
  
     for (x= 0; x < number_of_keys; ++x)
     {
-      uint32_t server;
-      
       if (hash[x] == ptr->number_of_hosts)
         continue; /* Already successfully sent */
 
-      server= hash[x] + replica;
+      uint32_t server= hash[x] + replica;
 
       /* In case of randomized reads */
-      if (randomize_read) {
-        if ((server + start) <= (hash[x] + ptr->number_of_replicas)) {
-          server += start;
-        }
-      }
+      if (randomize_read && ((server + start) <= (hash[x] + ptr->number_of_replicas)))
+        server += start;
       
       while (server >= ptr->number_of_hosts)
         server -= ptr->number_of_hosts;