Patch from evn
author <brian@gir-3.local> <>
Fri, 21 Nov 2008 23:45:23 +0000 (15:45 -0800)
committer <brian@gir-3.local> <>
Fri, 21 Nov 2008 23:45:23 +0000 (15:45 -0800)
libmemcached/common.h
libmemcached/memcached.h
libmemcached/memcached_connect.c
libmemcached/memcached_hash.c
libmemcached/memcached_io.c
libmemcached/memcached_io.h
libmemcached/memcached_purge.c
tests/function.c

index b8c8acf5279b84930e313157f22669b6c6a66b0d..1b1b13c3c1ac4354a54a7e36def16d844ef355d5 100644 (file)
@@ -129,4 +129,6 @@ void host_reset(memcached_st *ptr, memcached_server_st *host,
                 const char *hostname, unsigned int port, uint32_t weight,
                 memcached_connection type);
 
+memcached_return memcached_purge(memcached_server_st *ptr);
+
 #endif /* __COMMON_H__ */
index 96a4f15e38cc40e10feb94cdf2439b3cfe474583..ebe5f2396974905b931a8896629c7c1647dd5c30 100644 (file)
@@ -69,6 +69,7 @@ struct memcached_stat_st {
 };
 
 struct memcached_st {
+  uint8_t purging;
   memcached_allocated is_allocated;
   memcached_server_st *hosts;
   uint32_t number_of_hosts;
@@ -102,7 +103,6 @@ struct memcached_st {
   uint32_t server_failure_limit;
   uint32_t io_msg_watermark;
   uint32_t io_bytes_watermark;
-  char purging;
 };
 
 
index 4cd5219afebabb90689bb6c1fcf6e5a749138cb6..429e8ec66f581488efbefa920181e31efcea05bb 100644 (file)
@@ -46,6 +46,8 @@ static memcached_return set_hostinfo(memcached_server_st *server)
 
 static memcached_return set_socket_options(memcached_server_st *ptr)
 {
+  WATCHPOINT_ASSERT(ptr->fd != -1);
+
   if (ptr->type == MEMCACHED_CONNECTION_UDP)
     return MEMCACHED_SUCCESS;
 
@@ -167,6 +169,8 @@ test_connect:
       }
     }
   }
+
+  WATCHPOINT_ASSERT(ptr->fd != -1);
   return MEMCACHED_SUCCESS;
 }
 
@@ -234,7 +238,7 @@ test_connect:
             {
               goto handle_retry;
             }
-            else if (error != 1 && fds[0].revents & POLLERR)
+            else if (error != 1 || fds[0].revents & POLLERR)
             {
               ptr->cached_errno= errno;
               WATCHPOINT_ERRNO(ptr->cached_errno);
index ff7d0e39dc2732b49b92db7fd42ccf9969169431..29c8d04850a2d7d3d2b8e69a83153ebd62bce116 100644 (file)
@@ -131,7 +131,7 @@ static uint32_t dispatch_host(memcached_st *ptr, uint32_t hash)
         else
           right= middle;
       }
-      if (right > end)
+      if (right == end)
         right= begin;
       return right->index;
     } 
index 506dfd7a1013c5f3b9790105830c132c53ec220e..42d9f6f98f8ca504f1ed35a30b60f50d936b0b7c 100644 (file)
@@ -30,6 +30,7 @@ static memcached_return io_wait(memcached_server_st *ptr,
   fds[0].fd= ptr->fd;
   fds[0].events= flags;
 
+#ifdef NOT_DONE
   /*
   ** We are going to block on write, but at least on Solaris we might block
   ** on write if we haven't read anything from our input buffer..
@@ -39,7 +40,11 @@ static memcached_return io_wait(memcached_server_st *ptr,
   ** the test.
   */
   if (read_or_write == MEM_WRITE)
-    memcached_purge(ptr);
+  {
+    if (memcached_purge(ptr) != MEMCACHED_SUCCESS || memcached_purge(ptr) != MEMCACHED_STORED)
+      return MEMCACHED_FAILURE;
+  }
+#endif
 
   error= poll(fds, 1, ptr->root->poll_timeout);
 
@@ -176,6 +181,8 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
   size_t original_length;
   const char* buffer_ptr;
 
+  WATCHPOINT_ASSERT(ptr->fd != -1);
+
   original_length= length;
   buffer_ptr= buffer;
 
@@ -199,6 +206,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
       memcached_return rc;
       ssize_t sent_length;
 
+      WATCHPOINT_ASSERT(ptr->fd != -1);
       sent_length= io_flush(ptr, &rc);
       if (sent_length == -1)
         return -1;
@@ -210,6 +218,7 @@ ssize_t memcached_io_write(memcached_server_st *ptr,
   if (with_flush)
   {
     memcached_return rc;
+    WATCHPOINT_ASSERT(ptr->fd != -1);
     if (io_flush(ptr, &rc) == -1)
       return -1;
   }
@@ -258,6 +267,8 @@ static ssize_t io_flush(memcached_server_st *ptr,
 
   *error= MEMCACHED_SUCCESS;
 
+  WATCHPOINT_ASSERT(ptr->fd != -1);
+
   if (ptr->write_buffer_offset == 0)
     return 0;
 
@@ -271,6 +282,7 @@ static ssize_t io_flush(memcached_server_st *ptr,
   return_length= 0;
   while (write_length)
   {
+    WATCHPOINT_ASSERT(ptr->fd != -1);
     WATCHPOINT_ASSERT(write_length > 0);
     sent_length= 0;
     if (ptr->type == MEMCACHED_CONNECTION_UDP)
@@ -303,15 +315,25 @@ static ssize_t io_flush(memcached_server_st *ptr,
     }
     else
     {
+#ifdef NOT_DONE
       /*
       ** We might want to purge the input buffer if we haven't consumed
       ** any output yet... The test for the limits is the purge is inline
       ** in the purge function to avoid duplicating the logic..
       */
-      memcached_purge(ptr);
+      {
+        memcached_return rc;
+        WATCHPOINT_ASSERT(ptr->fd != -1);
+        rc= memcached_purge(ptr);
+
+        if (rc != MEMCACHED_SUCCESS || rc != MEMCACHED_STORED)
+          return -1;
+      }
+#endif
 
+      WATCHPOINT_ASSERT(ptr->fd != -1);
       if ((sent_length= write(ptr->fd, local_write_ptr, 
-                                       write_length)) == -1)
+                              write_length)) == -1)
       {
         switch (errno)
         {
index 1da530ee42b34b67e90caff3d6527b8ad0b7c542..8361a577b70d3fcb7f6e625316aa9d215d2dec84 100644 (file)
@@ -10,5 +10,4 @@ void memcached_io_reset(memcached_server_st *ptr);
 ssize_t memcached_io_read(memcached_server_st *ptr,
                           void *buffer, size_t length);
 memcached_return memcached_io_close(memcached_server_st *ptr);
-void memcached_purge(memcached_server_st *ptr);
 #endif /* __MEMCACHED_IO_H__ */
index 0fbd453ca9e48d03d9cceb5c44704a2130c84d74..c73e97ff9b2b9087936513b16f38a91ccd65854a 100644 (file)
@@ -3,11 +3,13 @@
 #include "common.h"
 #include "memcached_io.h"
 
-void memcached_purge(memcached_server_st *ptr) 
+memcached_return memcached_purge(memcached_server_st *ptr) 
 {
+  memcached_return rc;
   int32_t timeout;
   char buffer[2048];
   memcached_result_st result;
+  memcached_result_st *result_ptr;
 
   if (ptr->root->purging || /* already purging */
       (memcached_server_response_count(ptr) < ptr->root->io_msg_watermark && 
@@ -15,16 +17,19 @@ void memcached_purge(memcached_server_st *ptr)
       (ptr->io_bytes_sent > ptr->root->io_bytes_watermark && 
        memcached_server_response_count(ptr) < 10)) 
   {
-    return;
+    return MEMCACHED_SUCCESS;
   }
 
   /* memcached_io_write and memcached_response may call memcached_purge
      so we need to be able stop any recursion.. */
   ptr->root->purging= 1;
 
+  WATCHPOINT_ASSERT(ptr->fd != -1);
   /* Force a flush of the buffer to ensure that we don't have the n-1 pending
      requests buffered up.. */
-  memcached_io_write(ptr, NULL, 0, 1);
+  if (memcached_io_write(ptr, NULL, 0, 1) == -1)
+    return MEMCACHED_FAILURE;
+  WATCHPOINT_ASSERT(ptr->fd != -1);
 
   /* we have already incremented the response counter, and memcached_response
      will read out all messages.. To avoid memcached_response to wait forever
@@ -36,8 +41,20 @@ void memcached_purge(memcached_server_st *ptr)
      timeout if there is no data yet */
   timeout= ptr->root->poll_timeout;
   ptr->root->poll_timeout= 1;
-  memcached_response(ptr, buffer, sizeof(buffer), &result);
+  result_ptr= memcached_result_create(ptr->root, &result);
+
+  if (result_ptr == NULL)
+    return MEMCACHED_FAILURE;
+
+  WATCHPOINT_ASSERT(ptr->fd != -1);
+  rc= memcached_response(ptr, buffer, sizeof(buffer), &result);
+  WATCHPOINT_ERROR(rc);
+  WATCHPOINT_ASSERT(ptr->fd != -1);
   ptr->root->poll_timeout= timeout;
   memcached_server_response_increment(ptr);
   ptr->root->purging = 0;
+
+  memcached_result_free(&result);
+
+  return rc;
 }
index 4ec247f6dd2e022d341f5ed5b7d8c937464a1646..b6850288b5782571b964e1b47a8b466a7ac25212 100644 (file)
@@ -2161,7 +2161,12 @@ test_return user_supplied_bug18(memcached_st *memc)
   assert(strcmp(server_pool[7].hostname, "10.0.1.8") == 0);
   assert(server_pool[7].port == 11211);
   assert(server_pool[7].weight == 100);
-  
+
+  /* VDEAAAAA hashes to fffcd1b5, after the last continuum point, and lets
+   * us test the boundary wraparound.
+   */
+  assert(memcached_generate_hash(memc, (unsigned char *)"VDEAAAAA", 8) == memc->continuum[0].index);
+
   /* verify the standard ketama set. */
   for (i= 0; i < 99; i++)
   {