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