Added option to enable TCP_KEEPALIVE on created sockets.
authorAndre Cruz <andre@cabine.org>
Mon, 8 Mar 2010 14:30:21 +0000 (14:30 +0000)
committerAndre Cruz <andre@cabine.org>
Mon, 8 Mar 2010 14:30:21 +0000 (14:30 +0000)
docs/memcached_behavior.pod
libmemcached/behavior.c
libmemcached/connect.c
libmemcached/constants.h
libmemcached/memcached.c
libmemcached/memcached.h

index 2e0240afbe4c0c88a9463e22267739dc79f3543e..4095e8a5df8fa0c6ebf7b95e25ac89b1cde57c13 100644 (file)
@@ -211,11 +211,11 @@ other objects (on the 'n' next servers specified in your server list).
 
 =item MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ
 
-Allows randomizing the replica reads starting point. Normally the read is 
+Allows randomizing the replica reads starting point. Normally the read is
 done from primary server and in case of miss the read is done from primary
-+ 1, then primary + 2 all the way to 'n' replicas. If this option is set 
++ 1, then primary + 2 all the way to 'n' replicas. If this option is set
 on the starting point of the replica reads is randomized between the servers.
-This allows distributing read load to multiple servers with the expense of 
+This allows distributing read load to multiple servers with the expense of
 more write traffic.
 
 =item MEMCACHED_BEHAVIOR_CORK
@@ -224,9 +224,12 @@ Enable TCP_CORK behavior. This is only available as an option Linux.
 MEMCACHED_NO_SERVERS is returned if no servers are available to test with.
 MEMCACHED_NOT_SUPPORTED is returned if we were not able to determine
 if support was available. All other responses then MEMCACHED_SUCCESS
-report an error of some sort. This behavior also enables 
+report an error of some sort. This behavior also enables
 MEMCACHED_BEHAVIOR_TCP_NODELAY when set.
 
+=item MEMCACHED_BEHAVIOR_KEEPALIVE
+
+Enable TCP_KEEPALIVE behavior.
 
 =item MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE
 
index 886457a59a7867fcf31e18825aa7d8a037f2a020..aa697cfe8c37004e9b607e3d3120dee1d54562a0 100644 (file)
@@ -87,6 +87,10 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr,
     ptr->flags.tcp_nodelay= set_flag(data);
     memcached_quit(ptr);
     break;
+  case MEMCACHED_BEHAVIOR_TCP_KEEPALIVE:
+    ptr->flags.tcp_keepalive= set_flag(data);
+    memcached_quit(ptr);
+    break;
   case MEMCACHED_BEHAVIOR_DISTRIBUTION:
     return memcached_behavior_set_distribution(ptr, (memcached_server_distribution_t)data);
   case MEMCACHED_BEHAVIOR_KETAMA:
@@ -114,7 +118,7 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr,
       /**
         @note We try to keep the same distribution going. This should be deprecated and rewritten.
       */
-      return memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA); 
+      return memcached_behavior_set_distribution(ptr, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA);
     }
   case MEMCACHED_BEHAVIOR_HASH:
     return memcached_behavior_set_key_hash(ptr, (memcached_hash_t)(data));
@@ -324,8 +328,8 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
 
       instance= memcached_server_instance_fetch(ptr, 0);
 
-      /** 
-        @note REFACTOR 
+      /**
+        @note REFACTOR
       */
       if (instance)
       {
index 4b8939c11d4942802ea511134df2ad962acb3672..41bd7fb03429832d200ca3639a760e46aaa01041 100644 (file)
@@ -111,6 +111,18 @@ static memcached_return_t set_socket_options(memcached_server_st *ptr)
       return MEMCACHED_FAILURE;
   }
 
+  if (ptr->root->flags.tcp_keepalive)
+  {
+    int flag= 1;
+    int error;
+
+    error= setsockopt(ptr->fd, SOL_SOCKET, SO_KEEPALIVE,
+                      &flag, (socklen_t)sizeof(int));
+    WATCHPOINT_ASSERT(error == 0);
+    if (error)
+      return MEMCACHED_FAILURE;
+  }
+
   if (ptr->root->send_size > 0)
   {
     int error;
@@ -368,7 +380,7 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr)
     WATCHPOINT_ASSERT(0);
   }
 
-  unlikely ( rc != MEMCACHED_SUCCESS) 
+  unlikely ( rc != MEMCACHED_SUCCESS)
   {
     //@todo create interface around last_discontected_server
     memcached_st *root= (memcached_st *)ptr->root;
index f05b03ebb0316fe0dce49002ce284fc87bb409a8..6405df29180819b0dabdddec0e8670cacaa0f40a 100644 (file)
@@ -115,6 +115,7 @@ typedef enum {
   MEMCACHED_BEHAVIOR_NUMBER_OF_REPLICAS,
   MEMCACHED_BEHAVIOR_RANDOMIZE_REPLICA_READ,
   MEMCACHED_BEHAVIOR_CORK,
+  MEMCACHED_BEHAVIOR_TCP_KEEPALIVE,
   MEMCACHED_BEHAVIOR_MAX
 } memcached_behavior_t;
 
index 4e0308a043df72b29bdc43800a475d04942c73d7..647d0f790a3d6a763973185e19efb5bf23e3221e 100644 (file)
@@ -5,7 +5,7 @@
  * Use and distribution licensed under the BSD license.  See
  * the COPYING file in the parent directory for full text.
  *
- * Summary: 
+ * Summary:
  *
  */
 
@@ -32,7 +32,8 @@ static const memcached_st global_copy= {
     .use_cache_lookups= false,
     .use_sort_hosts= false,
     .use_udp= false,
-    .verify_key= false
+    .verify_key= false,
+    .tcp_keepalive= false
   }
 };
 
index 30823a8733d3d96cc12cfc666c74d2c61af14ef4..db164649922258dddd7832169e14d4ab8e1e33b2 100644 (file)
@@ -80,6 +80,7 @@ struct memcached_st {
     bool use_sort_hosts MEMCACHED_BITFIELD;
     bool use_udp MEMCACHED_BITFIELD;
     bool verify_key MEMCACHED_BITFIELD;
+    bool tcp_keepalive MEMCACHED_BITFIELD;
   } flags;
   memcached_server_distribution_t distribution;
   hashkit_st hashkit;