Added MEMCACHED_BEHAVIOR_SND_TIMEOUT, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
author <brian@localhost.localdomain> <>
Wed, 30 Jul 2008 22:19:22 +0000 (15:19 -0700)
committer <brian@localhost.localdomain> <>
Wed, 30 Jul 2008 22:19:22 +0000 (15:19 -0700)
ChangeLog
configure.ac
docs/memcached_behavior.pod
libmemcached/memcached.c
libmemcached/memcached.h
libmemcached/memcached_behavior.c
libmemcached/memcached_connect.c
libmemcached/memcached_constants.h
libmemcached/memcached_get.c
tests/function.c

index f047278e7d889032500ad71db5163e6940fcb810..c422b82c89660004db91c29ab251ec83ba707a1e 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -4,6 +4,7 @@
   * Support for weighted Ketama from Yin Chen.
   * Fix for Chinese 
   * Fix for 0 length key to trigger bad key.
+  * Added behaviors MEMCACHED_BEHAVIOR_SND_TIMEOUT, MEMCACHED_BEHAVIOR_RCV_TIMEOUT
 
 0.22 Mon Jul 14 09:24:11 PDT 2008
   * Fix where master key was no being checked for "bad key"
index d0c871c81b3396a28d77d3ec40457a0a1f97e54b..a99c994b10490218d367566b78bdaf6edf0d143a 100644 (file)
@@ -53,7 +53,7 @@ sinclude(config/debug.m4)
 sinclude(config/dtrace.m4)
 sinclude(config/byteorder.m4)
 sinclude(config/64bit.m4)
-sinclude(config/protocol_binary.m4)
+#sinclude(config/protocol_binary.m4)
 
 # We only support GCC and Sun's forte at the moment
 if test "$GCC" = "yes"
index 8821dcdfaff49d88da47d200dbb8baf8c671dd48..7807bc9f0496c86c854187511624eb31b50f1deb 100755 (executable)
@@ -44,6 +44,18 @@ available for storage functions. For read operations it is currently
 similar in performance to the non-blocking method (this is being
 looked into).
 
+=item MEMCACHED_BEHAVIOR_SND_TIMEOUT
+
+This sets the microsecond behavior of the socket against the SO_SNDTIMEO flag.
+In cases where you cannot use non-blocking IO this will allow you to still have
+timeouts on the sending of data.
+
+=item MEMCACHED_BEHAVIOR_RCV_TIMEOUT
+
+This sets the microsecond behavior of the socket against the SO_RCVTIMEO flag.
+In cases where you cannot use non-blocking IO this will allow you to still have
+timeouts on the reading of data.
+
 =item MEMCACHED_BEHAVIOR_TCP_NODELAY
 
 Turns on the no-delay feature for connecting sockets (may be faster in some
index dcf1a4a0c6bf73cf2ce8199b29b79ad47320fe6d..40f8e263e7f7f478d579de9a8e74ff26503e2fbe 100644 (file)
@@ -106,6 +106,9 @@ memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr)
   new_clone->hash_continuum= ptr->hash_continuum;
   new_clone->user_data= ptr->user_data;
 
+  new_clone->snd_timeout= ptr->snd_timeout;
+  new_clone->rcv_timeout= ptr->rcv_timeout;
+
   new_clone->on_clone= ptr->on_clone;
   new_clone->on_cleanup= ptr->on_cleanup;
   new_clone->call_free= ptr->call_free;
index 911b04447d96d0f286881f75b833e6e1aad91175..0cbb12f1cd0debfc28deb74c0265b4f5e0cea049 100644 (file)
@@ -95,6 +95,8 @@ struct memcached_st {
   size_t prefix_key_length;
   memcached_hash hash_continuum;
   uint32_t continuum_points_counter;
+  int32_t snd_timeout;
+  int32_t rcv_timeout;
 };
 
 
index 6b36626e9e07d00a2fa06b7d2525e75bfb3e20ad..f61fba52e6b6b5db168dac0a6f00231df890a67e 100644 (file)
@@ -23,6 +23,12 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
 {
   switch (flag)
   {
+  case MEMCACHED_BEHAVIOR_SND_TIMEOUT:
+    ptr->snd_timeout= (int32_t)data;
+    break;     
+  case MEMCACHED_BEHAVIOR_RCV_TIMEOUT:
+    ptr->rcv_timeout= (int32_t)data;
+    break;     
   case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL:
     set_behavior_flag(ptr, MEM_BINARY_PROTOCOL, data);
     break;     
index a4ed6680da1f82323561925d662d35cbb3b024e8..33a8a521924ca32faadf5cbcb00a9ea625ecbee6 100644 (file)
@@ -45,17 +45,26 @@ static memcached_return set_socket_options(memcached_server_st *ptr)
   if (ptr->type == MEMCACHED_CONNECTION_UDP)
     return MEMCACHED_SUCCESS;
 
-  if (ptr->root->flags & MEM_NO_BLOCK)
+  if (ptr->root->snd_timeout)
   {
     int error;
     struct timeval waittime;
 
-    waittime.tv_sec= 10;
-    waittime.tv_usec= 0;
+    waittime.tv_sec= 0;
+    waittime.tv_usec= ptr->root->snd_timeout;
 
     error= setsockopt(ptr->fd, SOL_SOCKET, SO_SNDTIMEO, 
                       &waittime, (socklen_t)sizeof(struct timeval));
     WATCHPOINT_ASSERT(error == 0);
+  }
+
+  if (ptr->root->rcv_timeout)
+  {
+    int error;
+    struct timeval waittime;
+
+    waittime.tv_sec= 0;
+    waittime.tv_usec= ptr->root->rcv_timeout;
 
     error= setsockopt(ptr->fd, SOL_SOCKET, SO_RCVTIMEO, 
                       &waittime, (socklen_t)sizeof(struct timeval));
index 0ee2568f3839a8c02e24a07a02dd56d347bba84e..d7770a73280f2881038a9d33fa83542736174ce9 100644 (file)
@@ -89,6 +89,8 @@ typedef enum {
   MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED,
   MEMCACHED_BEHAVIOR_KETAMA_HASH,
   MEMCACHED_BEHAVIOR_BINARY_PROTOCOL,
+  MEMCACHED_BEHAVIOR_SND_TIMEOUT,
+  MEMCACHED_BEHAVIOR_RCV_TIMEOUT,
 } memcached_behavior;
 
 typedef enum {
index dcaa8988a257344a543c34cf39e0fe6963c714c5..a84ef4f2a12c2416c49748e93580f61e875bc779 100644 (file)
@@ -250,6 +250,7 @@ static memcached_return binary_mget_by_key(memcached_st *ptr,
                                            unsigned int number_of_keys)
 {
   memcached_return rc= MEMCACHED_NOTFOUND;
+  int x;
 
   int flush= number_of_keys == 1;
 
@@ -257,7 +258,7 @@ static memcached_return binary_mget_by_key(memcached_st *ptr,
     If a server fails we warn about errors and start all over with sending keys
     to the server.
   */
-  for (int x= 0; x < number_of_keys; x++) 
+  for (x= 0; x < number_of_keys; x++) 
   {
     unsigned int server_key;
 
@@ -306,7 +307,7 @@ static memcached_return binary_mget_by_key(memcached_st *ptr,
     request.message.header.request.opcode= PROTOCOL_BINARY_CMD_NOOP;
     request.message.header.request.datatype= PROTOCOL_BINARY_RAW_BYTES;
     
-    for (int x= 0; x < ptr->number_of_hosts; x++)
+    for (x= 0; x < ptr->number_of_hosts; x++)
       if (memcached_server_response_count(&ptr->hosts[x])) 
       {
         if (memcached_io_write(&ptr->hosts[x], NULL, 0, 1) == -1) 
index e37aabef4e488cd61faac157f58bcc6cb2978b47..1cfd96a4f32660e8d4e3e4f18ffe4380881162f4 100644 (file)
@@ -2813,6 +2813,14 @@ memcached_return pre_nodelay(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
+memcached_return pre_settimer(memcached_st *memc)
+{
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 1000);
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 1000);
+
+  return MEMCACHED_SUCCESS;
+}
+
 memcached_return poll_timeout(memcached_st *memc)
 {
   int32_t timeout;
@@ -2959,9 +2967,10 @@ test_st consistent_weighted_tests[] ={
 
 collection_st collection[] ={
   {"block", 0, 0, tests},
-  {"binary", pre_binary, 0, tests},
+//  {"binary", pre_binary, 0, tests},
   {"nonblock", pre_nonblock, 0, tests},
   {"nodelay", pre_nodelay, 0, tests},
+  {"settimer", pre_settimer, 0, tests},
   {"md5", pre_md5, 0, tests},
   {"crc", pre_crc, 0, tests},
   {"hsieh", pre_hsieh, 0, tests},