New async test.
authorBrian Aker <brian@tangent.org>
Tue, 11 Dec 2007 08:11:46 +0000 (00:11 -0800)
committerBrian Aker <brian@tangent.org>
Tue, 11 Dec 2007 08:11:46 +0000 (00:11 -0800)
Lingerd is now working well with fcntl() in order to get async close.

lib/memcached_connect.c
lib/memcached_io.c
lib/memcached_quit.c
tests/function.c

index fd4518d59b24bb8a50707fbebf81c255399ed561..e00a630165a2e373805af086f441e49b61d0845c 100644 (file)
@@ -136,25 +136,13 @@ static memcached_return tcp_connect(memcached_st *ptr, unsigned int server_key)
       return MEMCACHED_CONNECTION_SOCKET_CREATE_FAILURE;
     }
 
-    /* For the moment, not getting a nonblocking mode will not be fatal */
-    if (ptr->flags & MEM_NO_BLOCK)
-    {
-      int flags;
-
-      flags= fcntl(ptr->hosts[server_key].fd, F_GETFL, 0);
-      if (flags != -1)
-      {
-        (void)fcntl(ptr->hosts[server_key].fd, F_SETFL, flags | O_NONBLOCK);
-      }
-    }
-
     if (ptr->flags & MEM_NO_BLOCK)
     {
       int error;
       struct linger linger;
 
       linger.l_onoff= 1; 
-      linger.l_linger= 400
+      linger.l_linger= 65536
       error= setsockopt(ptr->hosts[server_key].fd, SOL_SOCKET, SO_LINGER, 
                         &linger, (socklen_t)sizeof(struct linger));
       WATCHPOINT_ASSERT(error == 0);
@@ -188,6 +176,19 @@ static memcached_return tcp_connect(memcached_st *ptr, unsigned int server_key)
       WATCHPOINT_ASSERT(error == 0);
     }
 
+    /* For the moment, not getting a nonblocking mode will not be fatal */
+    if (ptr->flags & MEM_NO_BLOCK)
+    {
+      int flags;
+
+      flags= fcntl(ptr->hosts[server_key].fd, F_GETFL, 0);
+      if (flags != -1)
+      {
+        (void)fcntl(ptr->hosts[server_key].fd, F_SETFL, flags | O_NONBLOCK);
+      }
+    }
+
+
     /* connect to server */
 test_connect:
     if (connect(ptr->hosts[server_key].fd, 
index de3eda32875460018fa4aa320237197be0d40d53..85a27d962b3d4acc046e11c1bc9aca39b046db61 100644 (file)
@@ -150,19 +150,6 @@ ssize_t memcached_io_write(memcached_st *ptr, unsigned int server_key,
 
 memcached_return memcached_io_close(memcached_st *ptr, unsigned int server_key)
 {
-  if (ptr->flags & MEM_NO_BLOCK && 0)
-  {
-    int sock_size;
-    int error;
-    socklen_t sock_length;
-
-    error= getsockopt(ptr->hosts[server_key].fd, IPPROTO_TCP, SO_LINGER,
-                      &sock_size, &sock_length);
-
-    WATCHPOINT_NUMBER(error);
-    WATCHPOINT_NUMBER(sock_size);
-  }
-
   close(ptr->hosts[server_key].fd);
 
   return MEMCACHED_SUCCESS;
index 3125abadfafe8ac8794e3f53f097b994519b3dd1..9c77e71e0180dc552bff27f8922b231073a6d4a9 100644 (file)
@@ -27,6 +27,9 @@ void memcached_quit_server(memcached_st *ptr, unsigned int server_key, uint8_t i
 
       memcached_io_close(ptr, server_key);
     }
+    else
+      WATCHPOINT_ASSERT(0);
+
     ptr->hosts[server_key].fd= -1;
     ptr->hosts[server_key].stack_responses= 0;
     ptr->hosts[server_key].cursor_active= 0;
index 9c57ec4da926720d39eb250ab201bf993c6113d9..f21cb684a737cc7fff1d6e1c7db5f2b56faf7407 100644 (file)
@@ -341,6 +341,16 @@ uint8_t add_test(memcached_st *memc)
   return 0;
 }
 
+uint8_t add_wrapper(memcached_st *memc)
+{
+  unsigned int x;
+
+  for (x= 0; x < 10000; x++)
+    add_test(memc);
+
+  return 0;
+}
+
 uint8_t replace_test(memcached_st *memc)
 {
   memcached_return rc;
@@ -1930,6 +1940,11 @@ test_st tests[] ={
   {0, 0, 0}
 };
 
+test_st async_tests[] ={
+  {"add", 1, add_wrapper },
+  {0, 0, 0}
+};
+
 test_st string_tests[] ={
   {"string static with null", 0, string_static_null },
   {"string alloc with null", 0, string_alloc_null },
@@ -2001,6 +2016,7 @@ collection_st collection[] ={
   {"version_1_2_3", check_for_1_2_3, 0, version_1_2_3},
   {"string", 0, 0, string_tests},
   {"result", 0, 0, result_tests},
+  {"async", pre_nonblock, 0, async_tests},
   {"user", 0, 0, user_tests},
   {"generate", 0, 0, generate_tests},
   {"generate_hsieh", pre_hsieh, 0, generate_tests},