Adding in patch for DEAD server completion.
authorBrian Aker <brian@tangent.org>
Sun, 8 Jan 2012 00:54:08 +0000 (16:54 -0800)
committerBrian Aker <brian@tangent.org>
Sun, 8 Jan 2012 00:54:08 +0000 (16:54 -0800)
libmemcached-1.0/defaults.h
libmemcached-1.0/struct/memcached.h
libmemcached-1.0/types/behavior.h
libmemcached/behavior.cc
libmemcached/connect.cc
libmemcached/memcached.cc
tests/libmemcached-1.0/mem_functions.cc
tests/mem_udp.cc

index 355e63aac3a3e6f832ab699330be0c4df4e64d36..38c29ba38112a47aab62714e1271b0395e948825 100644 (file)
@@ -50,5 +50,6 @@
 #define MEMCACHED_EXPIRATION_NOT_ADD 0xffffffffU
 #define MEMCACHED_SERVER_FAILURE_LIMIT 5
 #define MEMCACHED_SERVER_FAILURE_RETRY_TIMEOUT 2
+#define MEMCACHED_SERVER_FAILURE_DEAD_TIMEOUT 0
 
 
index 564eb74e55b9c825252a2cf16dd6eed16c5db8cb..a3f9d279306d9e8a705f9163f2de611a5e6d3bff 100644 (file)
@@ -82,6 +82,7 @@ struct memcached_st {
   int32_t poll_timeout;
   int32_t connect_timeout; // How long we will wait on connect() before we will timeout
   int32_t retry_timeout;
+  int32_t dead_timeout;
   int send_size;
   int recv_size;
   void *user_data;
index 192b89e490bc5c79d78de971c50e831a236d7d80..d0af189ada06817b9fb8a6e9d880286ee2211adb 100644 (file)
@@ -75,6 +75,7 @@ enum memcached_behavior_t {
   MEMCACHED_BEHAVIOR_TCP_KEEPIDLE,
   MEMCACHED_BEHAVIOR_LOAD_FROM_FILE,
   MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS,
+  MEMCACHED_BEHAVIOR_DEAD_TIMEOUT,
   MEMCACHED_BEHAVIOR_MAX
 };
 
index 84e3aa58cba2138c31988860da7aa4f8fc025d86..8ffbd665ec570ae29d76fddc7571d9804d6849fe 100644 (file)
@@ -213,6 +213,10 @@ memcached_return_t memcached_behavior_set(memcached_st *ptr,
     ptr->retry_timeout= int32_t(data);
     break;
 
+  case MEMCACHED_BEHAVIOR_DEAD_TIMEOUT:
+    ptr->dead_timeout= int32_t(data);
+    break;
+
   case MEMCACHED_BEHAVIOR_SOCKET_SEND_SIZE:
     ptr->send_size= (int32_t)data;
     send_quit(ptr);
@@ -357,6 +361,9 @@ uint64_t memcached_behavior_get(memcached_st *ptr,
   case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
     return (uint64_t)ptr->retry_timeout;
 
+  case MEMCACHED_BEHAVIOR_DEAD_TIMEOUT:
+    return uint64_t(ptr->dead_timeout);
+
   case MEMCACHED_BEHAVIOR_SND_TIMEOUT:
     return (uint64_t)ptr->snd_timeout;
 
@@ -555,6 +562,7 @@ const char *libmemcached_string_behavior(const memcached_behavior_t flag)
   case MEMCACHED_BEHAVIOR_VERIFY_KEY: return "MEMCACHED_BEHAVIOR_VERIFY_KEY";
   case MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT: return "MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT";
   case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT: return "MEMCACHED_BEHAVIOR_RETRY_TIMEOUT";
+  case MEMCACHED_BEHAVIOR_DEAD_TIMEOUT: return "MEMCACHED_BEHAVIOR_DEAD_TIMEOUT";
   case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED: return "MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED";
   case MEMCACHED_BEHAVIOR_KETAMA_HASH: return "MEMCACHED_BEHAVIOR_KETAMA_HASH";
   case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: return "MEMCACHED_BEHAVIOR_BINARY_PROTOCOL";
index b81b25b992bf8fc57d5f7929cba9e2a4ff71b3cb..42cbe9bc9f502f224237ca3da09d9b336b96bafa 100644 (file)
@@ -554,6 +554,9 @@ static memcached_return_t network_connect(memcached_server_st *server)
 */
 static memcached_return_t backoff_handling(memcached_server_write_instance_st server, bool& in_timeout)
 {
+  struct timeval curr_time;
+  bool _gettime_success= (gettimeofday(&curr_time, NULL) == 0);
+
   /* 
     If we hit server_failure_limit then something is completely wrong about the server.
 
@@ -568,7 +571,21 @@ static memcached_return_t backoff_handling(memcached_server_write_instance_st se
     if (_is_auto_eject_host(server->root))
     {
       set_last_disconnected_host(server);
-      run_distribution((memcached_st *)server->root);
+
+      // Retry dead servers if requested
+      if (_gettime_success and server->root->dead_timeout > 0)
+      {
+        server->next_retry= curr_time.tv_sec +server->root->dead_timeout;
+
+        // We only retry dead servers once before assuming failure again
+        server->server_failure_counter= server->root->server_failure_limit -1;
+      }
+
+      memcached_return_t rc;
+      if (memcached_failed(rc= run_distribution((memcached_st *)server->root)))
+      {
+        return memcached_set_error(*server, rc, MEMCACHED_AT, memcached_literal_param("Backoff handling failed during run_distribution"));
+      }
 
       return memcached_set_error(*server, MEMCACHED_SERVER_MARKED_DEAD, MEMCACHED_AT);
     }
@@ -584,9 +601,6 @@ static memcached_return_t backoff_handling(memcached_server_write_instance_st se
 
   if (server->state == MEMCACHED_SERVER_STATE_IN_TIMEOUT)
   {
-    struct timeval curr_time;
-    bool _gettime_success= (gettimeofday(&curr_time, NULL) == 0);
-
     /*
       If next_retry is less then our current time, then we reset and try everything again.
     */
index 62052ada5ac25ec75bbd6759d6fb37567aa9cfab..1726b35fce634d7117bdd8244d6549200820fecb 100644 (file)
@@ -96,6 +96,7 @@ static inline bool _memcached_init(memcached_st *self)
   self->poll_timeout= MEMCACHED_DEFAULT_TIMEOUT;
   self->connect_timeout= MEMCACHED_DEFAULT_CONNECT_TIMEOUT;
   self->retry_timeout= MEMCACHED_SERVER_FAILURE_RETRY_TIMEOUT;
+  self->dead_timeout= MEMCACHED_SERVER_FAILURE_DEAD_TIMEOUT;
 
   self->send_size= -1;
   self->recv_size= -1;
@@ -234,7 +235,7 @@ memcached_st *memcached(const char *string, size_t length)
 memcached_return_t memcached_reset(memcached_st *ptr)
 {
   WATCHPOINT_ASSERT(ptr);
-  if (not ptr)
+  if (ptr == NULL)
   {
     return MEMCACHED_INVALID_ARGUMENTS;
   }
@@ -314,6 +315,7 @@ memcached_st *memcached_clone(memcached_st *clone, const memcached_st *source)
   new_clone->poll_timeout= source->poll_timeout;
   new_clone->connect_timeout= source->connect_timeout;
   new_clone->retry_timeout= source->retry_timeout;
+  new_clone->dead_timeout= source->dead_timeout;
   new_clone->distribution= source->distribution;
 
   if (hashkit_clone(&new_clone->hashkit, &source->hashkit) == NULL)
index dd2abef27d18de63078e232672f244707fe826d4..62b32473c77cd5448373bcebda78150cfb4904ae 100644 (file)
@@ -465,7 +465,7 @@ static test_return_t libmemcached_string_behavior_test(memcached_st *)
   {
     test_true(libmemcached_string_behavior(memcached_behavior_t(x)));
   }
-  test_compare(36, int(MEMCACHED_BEHAVIOR_MAX));
+  test_compare(37, int(MEMCACHED_BEHAVIOR_MAX));
 
   return TEST_SUCCESS;
 }
index 1591bdcf1c23f9263e76177bcb4f4d45f9312868..1ef95becad18fca438ada9365fbdc764f59d3331 100644 (file)
@@ -434,7 +434,7 @@ static test_return_t udp_decr_test(memcached_st *memc)
                memcached_set(memc, 
                              test_literal_param(__func__),
                              test_literal_param("1"),
-                             (time_t)0, (uint32_t)0));
+                             time_t(0), uint32_t(0)));
 
   Expected expected_ids;
   get_udp_request_ids(memc, expected_ids);