Update for last disconnect to stick around even if ejected.
authorBrian Aker <brian@gaz>
Mon, 5 Apr 2010 22:27:54 +0000 (15:27 -0700)
committerBrian Aker <brian@gaz>
Mon, 5 Apr 2010 22:27:54 +0000 (15:27 -0700)
libmemcached/connect.c
libmemcached/hosts.c
libmemcached/memcached.c
libmemcached/memcached.h
libmemcached/server.c
libmemcached/server.h
tests/mem_functions.c

index 38fc2ca194798ef97f816c719c9793bc20e5e4e4..f0ad282b0fb81ebf7684e62a777d5278498b599c 100644 (file)
@@ -382,7 +382,9 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr)
         run_distribution(root);
       }
 
-      root->last_disconnected_server = ptr;
+      if (ptr->root->last_disconnected_server)
+        memcached_server_free(ptr->root->last_disconnected_server);
+      root->last_disconnected_server= memcached_server_clone(NULL, ptr);
 
       return MEMCACHED_SERVER_MARKED_DEAD;
     }
@@ -407,14 +409,17 @@ memcached_return_t memcached_connect(memcached_server_write_instance_st ptr)
     WATCHPOINT_ASSERT(0);
   }
 
+  LIBMEMCACHED_MEMCACHED_CONNECT_END();
+
   unlikely ( rc != MEMCACHED_SUCCESS)
   {
-    //@todo create interface around last_discontected_server
     memcached_st *root= (memcached_st *)ptr->root;
-    root->last_disconnected_server = ptr;
-  }
 
-  LIBMEMCACHED_MEMCACHED_CONNECT_END();
+    //@todo create interface around last_discontected_server
+    if (ptr->root->last_disconnected_server)
+      memcached_server_free(ptr->root->last_disconnected_server);
+    root->last_disconnected_server= memcached_server_clone(NULL, ptr);
+  }
 
   return rc;
 }
index 0836c97e02128ddaf36c07287d66d051dc046fac..4018a2581d7846865378e583b7b0eca997fadb8e 100644 (file)
@@ -69,8 +69,6 @@ memcached_return_t run_distribution(memcached_st *ptr)
     WATCHPOINT_ASSERT(0); /* We have added a distribution without extending the logic */
   }
 
-  ptr->last_disconnected_server = NULL;
-
   return MEMCACHED_SUCCESS;
 }
 
index 0c38cc69f61ce637a2a99e62bdec622d71a371c9..5ffaee9e34ba0f243289e29bd7d32b08bebd0db6 100644 (file)
@@ -15,6 +15,7 @@ static const memcached_st global_copy= {
   .state= {
     .is_purging= false,
     .is_processing_input= false,
+    .is_time_for_rebuild= false,
   },
   .flags= {
     .auto_eject_hosts= false,
@@ -145,6 +146,10 @@ void memcached_servers_reset(memcached_st *ptr)
 
   memcached_server_list_set(ptr, NULL);
   ptr->number_of_hosts= 0;
+  if (ptr->last_disconnected_server)
+  {
+    memcached_server_free(ptr->last_disconnected_server);
+  }
   ptr->last_disconnected_server= NULL;
   ptr->server_failure_limit= 0;
 }
@@ -156,6 +161,9 @@ void memcached_free(memcached_st *ptr)
   memcached_server_list_free(memcached_server_list(ptr));
   memcached_result_free(&ptr->result);
 
+  if (ptr->last_disconnected_server)
+    memcached_server_free(ptr->last_disconnected_server);
+
   if (ptr->on_cleanup)
     ptr->on_cleanup(ptr);
 
index 2244c62dc2fa67c3911937d2f7d43046cc316fb5..668e9a124671de83ddebd4760d4605e439ab60a3 100644 (file)
@@ -62,6 +62,7 @@ struct memcached_st {
   struct {
     bool is_purging:1;
     bool is_processing_input:1;
+    bool is_time_for_rebuild:1;
   } state;
   struct {
     // Everything below here is pretty static.
index e7082af91356d9dd613691f52f0f3e106454a447..aac5a50efd3927ed26bdf91a00888eb710a9b9cf 100644 (file)
@@ -29,6 +29,7 @@ static inline void _server_init(memcached_server_st *self, const memcached_st *r
   self->server_failure_counter= 0;
   self->weight= weight;
   self->state.is_corked= false;
+  self->state.is_dead= false;
   self->major_version= 0;
   self->micro_version= 0;
   self->minor_version= 0;
index 92e6d88888d9594df71076ddc76ea721da60684e..6a2ae5eea1a77dfbf2a7f113597868793c956b25 100644 (file)
@@ -29,7 +29,8 @@ struct memcached_server_st {
   uint32_t server_failure_counter;
   uint32_t weight;
   struct { // Place any "state" sort variables in here.
-    bool is_corked;
+    bool is_corked:1;
+    bool is_dead:1;
   } state;
   uint8_t major_version;
   uint8_t micro_version;
index 75d00932e074b4e60dae83d591d5f50309f862c5..ea716a3420cf575b6bdfb1314f90948df08bdd75 100644 (file)
@@ -5462,6 +5462,24 @@ static test_return_t test_verbosity(memcached_st *memc)
   return TEST_SUCCESS;
 }
 
+static test_return_t test_cull_servers(memcached_st *memc)
+{
+  uint32_t count = memcached_server_count(memc);
+
+  // Do not do this in your code, it is not supported.
+  memc->servers[1].state.is_dead= true;
+  memc->state.is_time_for_rebuild= true;
+
+  uint32_t new_count= memcached_server_count(memc);
+  test_true(count == new_count);
+
+#if 0
+  test_true(count == new_count + 1 );
+#endif
+
+  return TEST_SUCCESS;
+}
+
 /*
  * This test ensures that the failure counter isn't incremented during
  * normal termination of the memcached instance.
@@ -5688,6 +5706,7 @@ test_st tests[] ={
 #endif
   {"test_get_last_disconnect", 1, (test_callback_fn)test_get_last_disconnect},
   {"verbosity", 1, (test_callback_fn)test_verbosity},
+  {"cull_servers", 1, (test_callback_fn)test_cull_servers},
   {0, 0, 0}
 };