Added support for MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH
authorTrond Norbye <trond.norbye@sun.com>
Sun, 3 May 2009 19:27:56 +0000 (12:27 -0700)
committerTrond Norbye <trond.norbye@sun.com>
Sun, 3 May 2009 19:27:56 +0000 (12:27 -0700)
From the man page:
The binary protocol works a bit different than the textual protocol in the
way that a multiget is implemented as a pipe of single get-operations that
is sent to the server in a chunk. If you use large multigets you may improve
the latency by setting this value so that you send out the first chunk of
requests when you hit the specified limit, allowing the server to start
processing the request and send the data back while the rest of the
requests is created.

docs/memcached_behavior.pod
libmemcached/memcached.c
libmemcached/memcached.h
libmemcached/memcached_behavior.c
libmemcached/memcached_constants.h
libmemcached/memcached_get.c
tests/function.c

index 2799dcce0ab2b0fc1ffd74121977d380f2c8d436..26a35ec9a1b278b0348fda118c2c76713bad70ac 100755 (executable)
@@ -178,6 +178,16 @@ at least 10 IO requests sent without reading the input buffer). Setting
 this value to high, may cause libmemcached to deadlock (trying to send 
 data, but the send will block because the input buffer in the kernel is full).
 
+=item MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH
+
+The binary protocol works a bit different than the textual protocol in the
+way that a multiget is implemented as a pipe of single get-operations that
+is sent to the server in a chunk. If you use large multigets you may improve
+the latency by setting this value so that you send out the first chunk of
+requests when you hit the specified limit, allowing the server to start
+processing the request and send the data back while the rest of the
+requests is created.
+
 =item MEMCACHED_BEHAVIOR_NOREPLY
 
 Set this value to specify that you really don't care about the result
index 5f8f308bf2799951a9bf3914176f233c35b70cf6..52b3834b7752fcfee7bb720e02c895c09c837fa6 100644 (file)
@@ -111,6 +111,7 @@ memcached_st *memcached_clone(memcached_st *clone, memcached_st *source)
   new_clone->server_failure_limit= source->server_failure_limit;
   new_clone->io_msg_watermark= source->io_msg_watermark;
   new_clone->io_bytes_watermark= source->io_bytes_watermark;
+  new_clone->io_key_prefetch= source->io_key_prefetch;
 
   if (source->hosts)
     rc= memcached_server_push(new_clone, source->hosts);
index aceab59b77bf2aac3b189019fb353012289d11ae..a8865a7b2943808db599a5969bd0e86114702227 100644 (file)
@@ -117,6 +117,7 @@ struct memcached_st {
   uint32_t server_failure_limit;
   uint32_t io_msg_watermark;
   uint32_t io_bytes_watermark;
+  uint32_t io_key_prefetch;
   time_t next_distribution_rebuild;
 };
 
index 77c9bd3bd89bf3c1fe57ece24413186382ccd43f..fb201d4ed82c4f1f31233f1d8bd7ba279f91a3c8 100644 (file)
@@ -30,6 +30,9 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
     ptr->io_bytes_watermark= (int32_t)data;
     break;
+  case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH:
+    ptr->io_key_prefetch = (int32_t)data;
+    break;
   case MEMCACHED_BEHAVIOR_SND_TIMEOUT:
     ptr->snd_timeout= (int32_t)data;
     break;     
@@ -170,6 +173,8 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
     return ptr->io_msg_watermark;
   case MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK:
     return ptr->io_bytes_watermark;
+  case MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH:
+    return ptr->io_key_prefetch;
   case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL:
     temp_flag= MEM_BINARY_PROTOCOL;
     break;     
index 9133a2626d14248f2432fcd03cb8eaafbde07d5e..db9c2a73dcdc03e6e022705c70728011bfee9754 100644 (file)
@@ -99,6 +99,7 @@ typedef enum {
   MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT,
   MEMCACHED_BEHAVIOR_IO_MSG_WATERMARK,
   MEMCACHED_BEHAVIOR_IO_BYTES_WATERMARK,
+  MEMCACHED_BEHAVIOR_IO_KEY_PREFETCH,
   MEMCACHED_BEHAVIOR_HASH_WITH_PREFIX_KEY,
   MEMCACHED_BEHAVIOR_NOREPLY,
   MEMCACHED_BEHAVIOR_USE_UDP,
index 9d33a85c27d0a9257d4d3e39c5d5996297d5145a..4d5fe7ca2d78a05330ac8c4993ba6ee9d400f32f 100644 (file)
@@ -311,7 +311,8 @@ static memcached_return binary_mget_by_key(memcached_st *ptr,
     if ((memcached_io_write(&ptr->hosts[server_key], request.bytes,
                             sizeof(request.bytes), 0) == -1) ||
         (memcached_io_write(&ptr->hosts[server_key], keys[x], 
-                            key_length[x], flush) == -1)) 
+                            key_length[x], 
+                            flush || (x > 0 && x == ptr->io_key_prefetch)) == -1)) 
     {
       memcached_server_response_reset(&ptr->hosts[server_key]);
       rc= MEMCACHED_SOME_ERRORS;
index 485a95ccdd448e0efff7101ed4de63fa4cf24b2c..bd03ee7012daf0c40ca93f89193b1313293e4708 100644 (file)
@@ -217,6 +217,7 @@ static test_return  clone_test(memcached_st *memc)
     assert(clone->hash_continuum == memc->hash_continuum);
     assert(clone->io_bytes_watermark == memc->io_bytes_watermark);
     assert(clone->io_msg_watermark == memc->io_msg_watermark);
+    assert(clone->io_key_prefetch == memc->io_key_prefetch);
     assert(clone->on_cleanup == memc->on_cleanup);
     assert(clone->on_clone == memc->on_clone);
     assert(clone->poll_timeout == memc->poll_timeout);