Allows zero as a value for retry.
authorBrian Aker <brian@tangent.org>
Wed, 20 Nov 2013 11:04:05 +0000 (06:04 -0500)
committerBrian Aker <brian@tangent.org>
Wed, 20 Nov 2013 11:04:05 +0000 (06:04 -0500)
ChangeLog
libmemcached/behavior.cc
libmemcached/server.hpp
tests/libmemcached-1.0/all_tests.h
tests/libmemcached-1.0/mem_functions.cc
tests/libmemcached-1.0/mem_functions.h

index 5fbed1604d924502373be1e7b4c50f8d78f6d42b..19a440203d4f49f30e8041235c7acfa8f5e3cfe2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,5 @@
 1.0.18
+* MEMCACHED_BEHAVIOR_RETRY_TIMEOUT can now be set to zero.
 
 1.0.17 Tue Apr  2 14:02:01 HST 2013
 * Remove c++ namespace that was being exposed (the API should be plug compatible)..
index 2675e23602db163dad9e00ca5e171025739fd606..081f8082f1ad89b1ef45160fe7e02b5b249188b3 100644 (file)
@@ -230,11 +230,6 @@ memcached_return_t memcached_behavior_set(memcached_st *shell,
     break;
 
   case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT:
-    if (data == 0)
-    {
-      return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT,
-                                        memcached_literal_param("MEMCACHED_BEHAVIOR_RETRY_TIMEOUT requires a value greater then zero."));
-    }
     ptr->retry_timeout= int32_t(data);
     break;
 
index 0c6ac798f35a0c7a59695be5a4f60dd77331c10e..708e64606610f462a73903fad188d6e5c1944c99 100644 (file)
@@ -76,17 +76,20 @@ static inline void memcached_mark_server_for_timeout(memcached_instance_st* serv
 {
   if (server->state != MEMCACHED_SERVER_STATE_IN_TIMEOUT)
   {
-    struct timeval next_time;
-    if (gettimeofday(&next_time, NULL) == 0)
+    if (server->root->retry_timeout != 0)
     {
-      server->next_retry= next_time.tv_sec +server->root->retry_timeout;
-    }
-    else
-    {
-      server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly
-    }
+      struct timeval next_time;
+      if (gettimeofday(&next_time, NULL) == 0)
+      {
+        server->next_retry= next_time.tv_sec +server->root->retry_timeout;
+      }
+      else
+      {
+        server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly
+      }
 
-    server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT;
+      server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT;
+    }
     if (server->server_failure_counter_query_id != server->root->query_id)
     {
       server->server_failure_counter++;
index d748d39e7e31e31e04df94a1c9550716b2a5097c..b4abe9dde7e3fe43df781066f8e6431ff0e3b62f 100644 (file)
@@ -284,6 +284,7 @@ test_st regression_tests[]= {
   {"lp:1021819", true, (test_callback_fn*)regression_1021819_TEST },
   {"lp:1048945", true, (test_callback_fn*)regression_1048945_TEST },
   {"lp:1067242", true, (test_callback_fn*)regression_1067242_TEST },
+  {"lp:1251482", true, (test_callback_fn*)regression_bug_1251482 },
   {0, false, (test_callback_fn*)0}
 };
 
index e69e0e121396e132a179a0953f29d8a68a99aea2..51ce9df6911d2f98c68b13a26095110b9cb2e139 100644 (file)
@@ -4559,7 +4559,7 @@ test_return_t wrong_failure_counter_two_test(memcached_st *memc)
 
   /* Put a retry timeout to effectively activate failure_limit effect */
   test_compare(MEMCACHED_SUCCESS,
-               memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, true));
+               memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1));
 
   /* change behavior that triggers memcached_quit()*/
   test_compare(MEMCACHED_SUCCESS,
@@ -4841,6 +4841,28 @@ test_return_t regression_bug_490520(memcached_st *original_memc)
   return TEST_SUCCESS;
 }
 
+test_return_t regression_bug_1251482(memcached_st*)
+{
+  test::Memc memc("--server=localhost:0");
+
+  memcached_behavior_set(&memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 0);
+
+  for (size_t x= 4; x; --x)
+  {
+    size_t value_length;
+    memcached_return_t rc;
+    char *value= memcached_get(&memc,
+                               test_literal_param(__func__),
+                               &value_length, NULL, &rc);
+
+    test_false(value);
+    test_compare(0LLU, value_length);
+    test_compare(MEMCACHED_CONNECTION_FAILURE, rc);
+  }
+
+  return TEST_SUCCESS;
+}
+
 test_return_t regression_1009493_TEST(memcached_st*)
 {
   memcached_st* memc= memcached_create(NULL);
index 757369316fbcfafccda44d9cecfadce089ae1f55..41aea1189c97a71d86ee8e1ca04d49d0bc12a16c 100644 (file)
@@ -187,3 +187,4 @@ test_return_t regression_1009493_TEST(memcached_st*);
 test_return_t regression_1048945_TEST(memcached_st*);
 test_return_t regression_1067242_TEST(memcached_st*);
 test_return_t comparison_operator_memcached_st_and__memcached_return_t_TEST(memcached_st*);
+test_return_t regression_bug_1251482(memcached_st*);