replicas in, but instead it will store the replicas together with all of the
other objects (on the 'n' next servers specified in your server list).
+=item MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
+
+Allows randomizing the replica reads starting point. Normally the read is
+done from primary server and in case of miss the read is done from primary
++ 1, then primary + 2 all the way to 'n' replicas. If this option is set
+on the starting point of the replica reads is randomized between the servers.
+This allows distributing read load to multiple servers with the expense of
+more write traffic.
+
=back
=head1 RETURN
set_behavior_flag(ptr, MEM_AUTO_EJECT_HOSTS, data);
break;
case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ:
+ srandom((uint32_t) time(NULL));
set_behavior_flag(ptr, MEM_RANDOMIZE_REPLICA_READ, data);
break;
default:
size_t number_of_keys)
{
memcached_return rc= MEMCACHED_NOTFOUND;
- uint32_t x, start = 0;
- uint64_t randomize_read = memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
+ uint32_t x, start= 0;
+ uint64_t randomize_read= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ);
- if (randomize_read) {
- srandom((uint32_t) time(NULL));
- start = (uint32_t)(random() % (ptr->number_of_replicas + 1));
- }
+ 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)
for (x= 0; x < number_of_keys; ++x)
{
- uint32_t server;
-
if (hash[x] == ptr->number_of_hosts)
continue; /* Already successfully sent */
- server= hash[x] + replica;
+ uint32_t server= hash[x] + replica;
/* In case of randomized reads */
- if (randomize_read) {
- if ((server + start) <= (hash[x] + ptr->number_of_replicas)) {
- server += start;
- }
- }
+ if (randomize_read && ((server + start) <= (hash[x] + ptr->number_of_replicas)))
+ server += start;
while (server >= ptr->number_of_hosts)
server -= ptr->number_of_hosts;