Implemented the TCP_KEEPIDLE tcp option. This is only available on Linux.
authorAndre Cruz <andre@cabine.org>
Mon, 8 Mar 2010 15:39:15 +0000 (15:39 +0000)
committerAndre Cruz <andre@cabine.org>
Mon, 8 Mar 2010 15:39:15 +0000 (15:39 +0000)
docs/memcached_behavior.pod
libmemcached/connect.c
libmemcached/memcached.c
libmemcached/memcached.h

index 4095e8a5df8fa0c6ebf7b95e25ac89b1cde57c13..c9a7104f10aae704e4ba7df2019728adca7e7310 100644 (file)
@@ -231,6 +231,10 @@ MEMCACHED_BEHAVIOR_TCP_NODELAY when set.
 
 Enable TCP_KEEPALIVE behavior.
 
+=item MEMCACHED_BEHAVIOR_KEEPALIVE_IDLE
+
+Specify time, in seconds, to mark a connection as idle. This is only available as an option Linux.
+
 =item MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
 
 Find the current size of SO_SNDBUF. A value of 0 means either an error
index 41bd7fb03429832d200ca3639a760e46aaa01041..67ceacab7a252312fb8095338d9b878ed7c621bb 100644 (file)
@@ -85,6 +85,20 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr)
   }
 #endif
 
+#ifdef TCP_KEEPIDLE
+  if (ptr->root->tcp_keepidle)
+  {
+    int flag= 1;
+    int error;
+
+    error= setsockopt(ptr->fd, IPPROTO_TCP, TCP_KEEPIDLE,
+                      &flag, (socklen_t)sizeof(int));
+    WATCHPOINT_ASSERT(error == 0);
+    if (error)
+      return MEMCACHED_FAILURE;
+  }
+#endif
+
   if (ptr->root->flags.no_block)
   {
     int error;
index 647d0f790a3d6a763973185e19efb5bf23e3221e..aef49973e4d8b3ae192adab5b3f163d7bfa20301 100644 (file)
@@ -63,6 +63,8 @@ static inline bool _memcached_init(memcached_st *self)
   self->io_msg_watermark= 500;
   self->io_bytes_watermark= 65 * 1024;
 
+  self->tcp_keepidle= 0;
+
   self->io_key_prefetch= 0;
   self->cached_errno= 0;
   self->poll_timeout= MEMCACHED_DEFAULT_TIMEOUT;
@@ -226,6 +228,7 @@ memcached_st *memcached_clone(memcached_st *clone, const memcached_st *source)
   new_clone->io_bytes_watermark= source->io_bytes_watermark;
   new_clone->io_key_prefetch= source->io_key_prefetch;
   new_clone->number_of_replicas= source->number_of_replicas;
+  new_clone->tcp_keepidle= source->tcp_keepidle;
 
   if (memcached_server_count(source))
     rc= memcached_push(new_clone, source);
index db164649922258dddd7832169e14d4ab8e1e33b2..1392cb2bc7efb75303f22895cd6bfc077e459872 100644 (file)
@@ -94,6 +94,7 @@ struct memcached_st {
   uint32_t io_msg_watermark;
   uint32_t io_bytes_watermark;
   uint32_t io_key_prefetch;
+  uint32_t tcp_keepidle;
   int cached_errno;
   int32_t poll_timeout;
   int32_t connect_timeout;