X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=libmemcached%2Fmemcached_get.c;h=0aa0f44c108d4e4ebe4dad8b1a5908201dc65427;hb=f10c3a3677bdd5a1848e7497a674a938956d7f3d;hp=cf0d210d27c2444842aac08f237bc81780d6a268;hpb=109d5bfa8df63c0944417e0f556679b48030c66d;p=m6w6%2Flibmemcached diff --git a/libmemcached/memcached_get.c b/libmemcached/memcached_get.c index cf0d210d..0aa0f44c 100644 --- a/libmemcached/memcached_get.c +++ b/libmemcached/memcached_get.c @@ -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;