Added randomized read behavior
authorMikko Koppanen <mkoppanen@gameboy.config>
Fri, 27 Nov 2009 10:40:32 +0000 (10:40 +0000)
committerMikko Koppanen <mkoppanen@gameboy.config>
Fri, 27 Nov 2009 10:40:32 +0000 (10:40 +0000)
libmemcached/common.h
libmemcached/memcached_behavior.c
libmemcached/memcached_constants.h
libmemcached/memcached_get.c

index b46d5ba06cd3a5c22fd2ef8bcc62a4f118723c0e..99d4ce78f103e875a92c655b34d312730c2eaf5c 100644 (file)
@@ -93,7 +93,8 @@ typedef enum {
   MEM_HASH_WITH_PREFIX_KEY= (1 << 13),
   MEM_NOREPLY= (1 << 14),
   MEM_USE_UDP= (1 << 15),
-  MEM_AUTO_EJECT_HOSTS= (1 << 16)
+  MEM_AUTO_EJECT_HOSTS= (1 << 16),
+  MEM_RANDOMIZE_REPLICA_READ= (1 << 17)
 } memcached_flags;
 
 /* Hashing algo */
index 72b0d5ccada8418f613fee07248e1cffec0b74ea..7196a066e88e72177ee2d5ed3cc7607790638f65 100644 (file)
@@ -176,6 +176,9 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS:
     set_behavior_flag(ptr, MEM_AUTO_EJECT_HOSTS, data);
     break;
+    case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ:
+      set_behavior_flag(ptr, MEM_RANDOMIZE_REPLICA_READ, data);
+      break;
   default:
     /* Shouldn't get here */
     WATCHPOINT_ASSERT(flag);
@@ -304,6 +307,9 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS:
     temp_flag= MEM_AUTO_EJECT_HOSTS;
     break;
+  case MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ:
+    temp_flag= MEM_RANDOMIZE_REPLICA_READ;
+    break;
   default:
     WATCHPOINT_ASSERT(flag);
     break;
index 7399d6cbd11202aa092fe0d5e0078da6d22d13f9..b19f03c78d33cad617890f40431c234ad4859318 100644 (file)
@@ -106,7 +106,8 @@ typedef enum {
   MEMCACHED_BEHAVIOR_USE_UDP,
   MEMCACHED_BEHAVIOR_AUTO_EJECT_HOSTS,
   MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS,
-  MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE
+  MEMCACHED_BEHAVIOR_KETAMA_COMPAT_MODE,
+  MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
 } memcached_behavior;
 
 #define MEMCACHED_KETAMA_COMPAT_LIBMEMCACHED 0
index 3436186f24a4803a32bf107e9c0f773489f8f53f..6c730093c9cd14d8407b36f7f6a2b6d45c15f551 100644 (file)
@@ -432,18 +432,35 @@ 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) {
+    srandom((uint32_t) time(NULL));
+    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)
     {
+      uint32_t server;
+      
       if (hash[x] == ptr->number_of_hosts)
         continue; /* Already successfully sent */
 
-      uint32_t server= hash[x] + replica;
+      server= hash[x] + replica;
+
+      /* In case of randomized reads */
+      if (randomize_read) {
+        if ((server + start) <= (hash[x] + ptr->number_of_replicas)) {
+          server += start;
+        }
+      }
+      
       while (server >= ptr->number_of_hosts)
         server -= ptr->number_of_hosts;