Fix (though only partial), for connect timeout.
authorBrian Aker <brian@gaz>
Mon, 7 Jun 2010 21:06:53 +0000 (14:06 -0700)
committerBrian Aker <brian@gaz>
Mon, 7 Jun 2010 21:06:53 +0000 (14:06 -0700)
libmemcached/connect.c
libmemcached/memcached.h
tests/mem_functions.c

index 8d0e0a9b389982372588860cefa5cddbb26f2a39..b17400ab3fe80ea6e01ddcc17afe321f6d02efaa 100644 (file)
@@ -316,7 +316,7 @@ static memcached_return_t network_connect(memcached_server_st *ptr)
           fds[0].events = POLLOUT;
 
           int timeout= ptr->root->connect_timeout;
-          if (ptr->root->flags.no_block == false)
+          if (ptr->root->flags.no_block == true)
             timeout= -1;
 
           size_t loop_max= 5;
@@ -330,6 +330,8 @@ static memcached_return_t network_connect(memcached_server_st *ptr)
               loop_max= 1;
               break;
             case 0:
+              if (loop_max==1) 
+                return MEMCACHED_TIMEOUT;
               continue;
               // A real error occurred and we need to completely bail
             default:
index 26f101f2ea81d75f2924237fa12d73b783c8e6ff..a7cdc97722e289e079b79582e4e129cf93965fdf 100644 (file)
@@ -72,7 +72,7 @@ struct memcached_st {
     bool cork:1;
     bool hash_with_prefix_key:1;
     bool ketama_weighted:1;
-    bool no_block:1;
+    bool no_block:1; // Don't block
     bool no_reply:1;
     bool randomize_replica_read:1;
     bool reuse_memory:1;
index 11d7219b68f2b2e6bf0be1bf18351883ebfe2b06..ba99c0be58fbeec912fa714d7b2842bb80bc1c6e 100644 (file)
@@ -5860,6 +5860,34 @@ static test_return_t regression_bug_490486(memcached_st *memc)
   return TEST_SUCCESS;
 }
 
+static test_return_t regression_bug_583031(memcached_st *unused)
+{
+  (void)unused;
+
+    memcached_st *memc= memcached_create(NULL);
+    assert(memc);
+    memcached_server_add(memc, "10.2.3.4", 11211);
+
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_CONNECT_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SND_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RCV_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_POLL_TIMEOUT, 1000);
+    memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT, 3);
+
+    memcached_return_t rc;
+    size_t length;
+    uint32_t flags;
+
+    (void)memcached_get(memc, "dsf", 3, &length, &flags, &rc);
+
+    test_true(rc == MEMCACHED_TIMEOUT);
+
+    memcached_free(memc);
+
+    return TEST_SUCCESS;
+}
+
 static void memcached_die(memcached_st* mc, memcached_return error, const char* what, uint32_t it)
 {
   fprintf(stderr, "Iteration #%u: ", it);
@@ -6171,6 +6199,7 @@ test_st regression_tests[]= {
   {"lp:447342", 1, (test_callback_fn)regression_bug_447342 },
   {"lp:463297", 1, (test_callback_fn)regression_bug_463297 },
   {"lp:490486", 1, (test_callback_fn)regression_bug_490486 },
+  {"lp:583031", 1, (test_callback_fn)regression_bug_583031 },
   {"lp:?", 1, (test_callback_fn)regression_bug_ },
   {0, 0, (test_callback_fn)0}
 };