}
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;
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;