Merge from Mikki
[m6w6/libmemcached] / libmemcached / memcached_get.c
index cf0d210d27c2444842aac08f237bc81780d6a268..0aa0f44c108d4e4ebe4dad8b1a5908201dc65427 100644 (file)
@@ -279,14 +279,27 @@ memcached_return memcached_mget_by_key(memcached_st *ptr,
 }
 
 memcached_return memcached_mget_execute(memcached_st *ptr,
-                                        const char *master_key,
-                                        size_t master_key_length,
                                         const char * const *keys,
                                         const size_t *key_length,
                                         size_t number_of_keys,
                                         memcached_execute_function *callback,
                                         void *context,
                                         unsigned int number_of_callbacks)
+{
+  return memcached_mget_execute_by_key(ptr, NULL, 0, keys, key_length,
+                                       number_of_keys, callback,
+                                       context, number_of_callbacks);
+}
+
+memcached_return memcached_mget_execute_by_key(memcached_st *ptr,
+                                               const char *master_key,
+                                               size_t master_key_length,
+                                               const char * const *keys,
+                                               const size_t *key_length,
+                                               size_t number_of_keys,
+                                               memcached_execute_function *callback,
+                                               void *context,
+                                               unsigned int number_of_callbacks)
 {
   if ((ptr->flags & MEM_BINARY_PROTOCOL) == 0)
     return MEMCACHED_NOT_SUPPORTED;
@@ -419,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;