memcached_behavior_set() can now modify the poll timeout
authorBrian Aker <brian@tangent.org>
Thu, 22 Nov 2007 06:54:48 +0000 (22:54 -0800)
committerBrian Aker <brian@tangent.org>
Thu, 22 Nov 2007 06:54:48 +0000 (22:54 -0800)
ChangeLog
configure.ac
docs/memcached_behavior.pod
include/memcached.h
lib/memcached.c
lib/memcached_behavior.c
lib/memcached_io.c
tests/function.c
tests/output.res

index efb225ca0d065196f14426d2a22f2141129572f3..9829ffdf175da6a66066ed62f61cb7bb13d45ec7 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+0.11 
+  * Added option to memcache_behavior_set() so that poll() can be timed out.
+
 0.10 Tue Nov 20 23:22:31 PST 2007
   * Added append binary test.
   * Added MEMCACHED_BEHAVIOR_CACHE_LOOKUPS behavior so that you can save on
index db73e65c8e22f99b37e0b712da2a0c495dac725d..3c2310eb7794796e8cb784be05125d2969069ad2 100644 (file)
@@ -6,7 +6,7 @@ MEMCACHED_LIBRARY_NAME=libmemcached
 
 #release versioning
 MEMCACHED_MAJOR_VERSION=0
-MEMCACHED_MINOR_VERSION=10
+MEMCACHED_MINOR_VERSION=11
 MEMCACHED_MICRO_VERSION=0
 
 #API version
index 20141907ba8f281cf34ab2567cf53b81986c8dd9..cd3288da838489fbce5af7176c9a89e68ad5c5f0 100755 (executable)
@@ -59,6 +59,11 @@ Memcached can cache named lookups so that DNS lookups are made only once.
 
 Support CAS operations (this is not enabled by default at this point in the server since it imposes a slight performance penalty).
 
+=item MEMCACHED_BEHAVIOR_POLL_TIMEOUT
+
+Modify the timeout value that is used by poll(). The default value is -1. An signed int pointer must be passed to memcached_behavior_set() to change this value. For memcached_behavior_get() a signed int value will be cast and returned as the unsigned long long.
+
+
 =back
 
 =head1 RETURN
index e64bfb5d6f78c8b69a0277cfe8151eb4de63a6c5..54f529528c7879b8a6507c68617ec2b90dcb4230 100644 (file)
@@ -75,6 +75,7 @@ typedef enum {
   MEMCACHED_BEHAVIOR_SOCKET_RECV_SIZE,
   MEMCACHED_BEHAVIOR_CACHE_LOOKUPS,
   MEMCACHED_BEHAVIOR_SUPPORT_CAS,
+  MEMCACHED_BEHAVIOR_POLL_TIMEOUT,
 } memcached_behavior;
 
 typedef enum {
@@ -178,6 +179,7 @@ struct memcached_st {
   unsigned long long flags;
   int send_size;
   int recv_size;
+  int32_t poll_timeout;
   memcached_string_st result_buffer;
   memcached_hash hash;
   memcached_return warning; /* Future Use */
index 5f0d98207e3269ca9c3d21f8e991c927edaa9dfa..a484462b0b68370be4dd7d488433f3c504d3f3e8 100644 (file)
@@ -22,6 +22,7 @@ memcached_st *memcached_create(memcached_st *ptr)
   }
   string_ptr= memcached_string_create(ptr, &ptr->result_buffer, 0);
   WATCHPOINT_ASSERT(string_ptr);
+  ptr->poll_timeout= -1;
 
   return ptr;
 }
@@ -73,6 +74,7 @@ memcached_st *memcached_clone(memcached_st *clone, memcached_st *ptr)
   new_clone->number_of_hosts= ptr->number_of_hosts;
   new_clone->send_size= ptr->send_size;
   new_clone->recv_size= ptr->recv_size;
+  new_clone->poll_timeout= ptr->poll_timeout;
 
   return new_clone;
 }
index 76d0b61fb54b8be2b65903fede6adbbdc8bc64a7..910fb392e9e27e729d03c9359f0bf28bacfe2125 100644 (file)
@@ -44,6 +44,13 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_KETAMA:
     set_behavior_flag(ptr, MEM_USE_KETAMA, data);
     break;
+  case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
+    {
+      unsigned int timeout= (*((unsigned int *)data));
+
+      ptr->poll_timeout= timeout;
+      break;
+    }
   case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
     {
       ptr->send_size= (*((int *)data));
@@ -87,6 +94,10 @@ unsigned long long memcached_behavior_get(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_KETAMA:
     temp_flag= MEM_USE_KETAMA;
     break;
+  case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
+    {
+      return (unsigned long long)ptr->poll_timeout;
+    }
   case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
     {
       int sock_size;
index 06ac2e9b51862f3929429d754ea12ba30b272075..973ccf95f676ccc428657b200ba30b287d3c68c5 100644 (file)
@@ -11,7 +11,10 @@ static int io_wait(memcached_st *ptr, unsigned int server_key, unsigned read_or_
 {
   struct pollfd fds[1];
   short flags= 0;
+  struct timespec timer;
 
+  timer.tv_sec= 1;
+  timer.tv_nsec= 0;
   if (read_or_write)
     flags= POLLOUT |  POLLERR;
   else
@@ -21,7 +24,7 @@ static int io_wait(memcached_st *ptr, unsigned int server_key, unsigned read_or_
   fds[0].fd= ptr->hosts[server_key].fd;
   fds[0].events= flags;
 
-  if (poll(fds, 1, -1) < 0)
+  if (poll(fds, 1, ptr->poll_timeout) < 0)
     return MEMCACHED_FAILURE;
 
   return MEMCACHED_SUCCESS;
index 8316ad6c4edb5db66dc11cb5439bc87752c7cea6..640fbfe45d19c9147d8f1be845ad8964892ab18b 100644 (file)
@@ -1676,6 +1676,21 @@ memcached_return pre_nodelay(memcached_st *memc)
   return MEMCACHED_SUCCESS;
 }
 
+memcached_return poll_timeout(memcached_st *memc)
+{
+  int32_t timeout;
+
+  timeout= 100;
+
+  memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, &timeout);
+
+  timeout= (int32_t)memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT);
+
+  assert(timeout == 100);
+
+  return MEMCACHED_SUCCESS;
+}
+
 
 /* Clean the server before beginning testing */
 test_st tests[] ={
@@ -1766,6 +1781,7 @@ collection_st collection[] ={
   {"ketama", pre_hash_ketama, 0, tests},
   {"unix_socket", pre_unix_socket, 0, tests},
   {"unix_socket_nodelay", pre_nodelay, 0, tests},
+  {"poll_timeout", poll_timeout, 0, tests},
   {"gets", enable_cas, 0, tests},
 //  {"udp", pre_udp, 0, tests},
   {"version_1_2_3", check_for_1_2_3, 0, version_1_2_3},
index 9bd97459fe8202e43a0973956766fd6d2cdb94ad..6594f947dbb8c3a2e21ad151bec6e33c657bcdb8 100644 (file)
@@ -1285,3 +1285,110 @@ Found key bytes_read
 Found key bytes_written
 Found key limit_maxbytes
 Found key threads
+Error 0 -> SUCCESS
+Error 1 -> FAILURE
+Error 2 -> HOSTNAME LOOKUP FAILURE
+Error 3 -> CONNECTION FAILURE
+Error 4 -> CONNECTION BIND FAILURE
+Error 5 -> WRITE FAILURE
+Error 6 -> READ FAILURE
+Error 7 -> UNKNOWN READ FAILURE
+Error 8 -> PROTOCOL ERROR
+Error 9 -> CLIENT ERROR
+Error 10 -> SERVER ERROR
+Error 11 -> CONNECTION SOCKET CREATE FAILURE
+Error 12 -> CONNECTION DATA EXISTS
+Error 13 -> CONNECTION DATA DOES NOT EXIST
+Error 14 -> NOT STORED
+Error 15 -> STORED
+Error 16 -> NOT FOUND
+Error 17 -> MEMORY ALLOCATION FAILURE
+Error 18 -> PARTIAL READ
+Error 19 -> SOME ERRORS WERE REPORTED
+Error 20 -> NO SERVERS DEFINED
+Error 21 -> SERVER END
+Error 22 -> SERVER DELETE
+Error 23 -> SERVER VALUE
+Error 24 -> STAT VALUE
+Error 25 -> SYSTEM ERROR
+Error 26 -> COULD NOT OPEN UNIX SOCKET
+Error 27 -> ACTION NOT SUPPORTED
+Error 28 -> A KEY LENGTH OF ZERO WAS PROVIDED
+Found key pid
+Found key uptime
+Found key time
+Found key version
+Found key pointer_size
+Found key rusage_user
+Found key rusage_system
+Found key rusage_user_seconds
+Found key rusage_user_microseconds
+Found key rusage_system_seconds
+Found key rusage_system_microseconds
+Found key curr_items
+Found key total_items
+Found key bytes
+Found key curr_connections
+Found key total_connections
+Found key connection_structures
+Found key cmd_get
+Found key cmd_set
+Found key get_hits
+Found key get_misses
+Found key evictions
+Found key bytes_read
+Found key bytes_written
+Found key limit_maxbytes
+Found key threads
+Found key pid
+Found key uptime
+Found key time
+Found key version
+Found key pointer_size
+Found key rusage_user
+Found key rusage_system
+Found key rusage_user_seconds
+Found key rusage_user_microseconds
+Found key rusage_system_seconds
+Found key rusage_system_microseconds
+Found key curr_items
+Found key total_items
+Found key bytes
+Found key curr_connections
+Found key total_connections
+Found key connection_structures
+Found key cmd_get
+Found key cmd_set
+Found key get_hits
+Found key get_misses
+Found key evictions
+Found key bytes_read
+Found key bytes_written
+Found key limit_maxbytes
+Found key threads
+Found key pid
+Found key uptime
+Found key time
+Found key version
+Found key pointer_size
+Found key rusage_user
+Found key rusage_system
+Found key rusage_user_seconds
+Found key rusage_user_microseconds
+Found key rusage_system_seconds
+Found key rusage_system_microseconds
+Found key curr_items
+Found key total_items
+Found key bytes
+Found key curr_connections
+Found key total_connections
+Found key connection_structures
+Found key cmd_get
+Found key cmd_set
+Found key get_hits
+Found key get_misses
+Found key evictions
+Found key bytes_read
+Found key bytes_written
+Found key limit_maxbytes
+Found key threads