Merge in 1.0.3
[m6w6/libmemcached] / libmemcached / connect.cc
index 6cad60d5ed4f942799d77f1edea8710e5725b1c7..42cbe9bc9f502f224237ca3da09d9b336b96bafa 100644 (file)
@@ -129,7 +129,7 @@ static memcached_return_t connect_poll(memcached_server_st *server)
   return memcached_set_errno(*server, get_socket_errno(), MEMCACHED_AT);
 }
 
-static memcached_return_t set_hostinfo(memcached_server_st *server)
+memcached_return_t set_hostinfo(memcached_server_st *server)
 {
   if (server->address_info)
   {
@@ -231,7 +231,7 @@ static inline void set_socket_nonblocking(memcached_server_st *server)
 
 static void set_socket_options(memcached_server_st *server)
 {
-  assert_msg(server->fd != -1, "invalid socket was passed to set_socket_options()");
+  assert_msg(server->fd != INVALID_SOCKET, "invalid socket was passed to set_socket_options()");
 
   if (memcached_is_udp(server->root))
   {
@@ -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.
     */