Merge from Mikki
[m6w6/libmemcached] / libmemcached / memcached_get.c
index 3436186f24a4803a32bf107e9c0f773489f8f53f..0aa0f44c108d4e4ebe4dad8b1a5908201dc65427 100644 (file)
@@ -432,18 +432,28 @@ static memcached_return replication_binary_mget(memcached_st *ptr,
                                                 size_t number_of_keys)
 {
   memcached_return rc= MEMCACHED_NOTFOUND;
-  uint32_t x;
+  uint32_t x, start= 0;
+  uint64_t randomize_read= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
+
+  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)
   {
-    bool success= true;    
-
+    bool success= true;
     for (x= 0; x < number_of_keys; ++x)
     {
       if (hash[x] == ptr->number_of_hosts)
         continue; /* Already successfully sent */
 
       uint32_t server= hash[x] + replica;
+
+      /* In case of randomized reads */
+      if (randomize_read && ((server + start) <= (hash[x] + ptr->number_of_replicas)))
+        server += start;
+      
       while (server >= ptr->number_of_hosts)
         server -= ptr->number_of_hosts;