Bugfix for memcached_connect() so that it will not always start up servers.
authorBrian Aker <brian@tangent.org>
Sun, 25 Nov 2007 00:17:59 +0000 (16:17 -0800)
committerBrian Aker <brian@tangent.org>
Sun, 25 Nov 2007 00:17:59 +0000 (16:17 -0800)
12 files changed:
ChangeLog
include/memcached.h
lib/memcached.c
lib/memcached_connect.c
lib/memcached_flush.c
lib/memcached_get.c
lib/memcached_hash.c
lib/memcached_hosts.c
lib/memcached_result.c
lib/memcached_storage.c
lib/memcached_string.c
tests/function.c

index a10bca6dff254acc46dadc08a4e553ac8eb8341c..a77151a5017c3da6ca17f25d19e2cf456474ac48 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -2,6 +2,8 @@
   * Added option to memcache_behavior_set() so that poll() can be timed out.
   * Fixed memory leak in case of using memcached_fetch_result() where no
     value was returned.
+  * Bug fixed in memcached_connect() which would cause servers that 
+    did not need to be enabled to be enabled (performance issue).
 
 0.10 Tue Nov 20 23:22:31 PST 2007
   * Added append binary test.
index bef7e5d647da275b7fda627bb0f79e9740e017d5..48790ce8e28e4921b65015ffc1b94862a25e5655 100644 (file)
@@ -99,6 +99,7 @@ typedef enum {
 typedef enum {
   MEMCACHED_NOT_ALLOCATED,
   MEMCACHED_ALLOCATED,
+  MEMCACHED_USED,
 } memcached_allocated;
 
 struct memcached_server_st {
index a484462b0b68370be4dd7d488433f3c504d3f3e8..e40c3db4c229d1b02e984abb7daa2aba439b2c70 100644 (file)
@@ -41,7 +41,7 @@ void memcached_free(memcached_st *ptr)
   if (ptr->is_allocated == MEMCACHED_ALLOCATED)
     free(ptr);
   else
-    memset(ptr, 0, sizeof(memcached_st));
+    ptr->is_allocated= MEMCACHED_USED;
 }
 
 /*
index 1a7cde1676dc2e536607fe5547f9d8637f0db6ab..0135fc9a31f66bb723bb29a3174d8753a8618089 100644 (file)
@@ -123,13 +123,15 @@ static memcached_return tcp_connect(memcached_st *ptr, unsigned int server_key)
     /* Old connection junk still is in the structure */
     WATCHPOINT_ASSERT(ptr->hosts[server_key].stack_responses == 0);
 
-    if (ptr->hosts[server_key].servAddr.sin_family == 0)
+    if (ptr->hosts[server_key].sockaddr_inited == MEMCACHED_NOT_ALLOCATED || 
+        (!(ptr->flags & MEM_USE_CACHE_LOOKUPS)))
     {
       memcached_return rc;
 
       rc= set_hostinfo(&ptr->hosts[server_key]);
       if (rc != MEMCACHED_SUCCESS)
         return rc;
+      ptr->hosts[server_key].sockaddr_inited= MEMCACHED_ALLOCATED;
     }
 
     /* Create the socket */
@@ -208,64 +210,26 @@ memcached_return memcached_connect(memcached_st *ptr, unsigned int server_key)
     return MEMCACHED_NO_SERVERS;
 
   /* We need to clean up the multi startup piece */
-  if (server_key)
+  switch (ptr->hosts[server_key].type)
   {
+  case MEMCACHED_CONNECTION_UNKNOWN:
+    WATCHPOINT_ASSERT(0);
+    rc= MEMCACHED_NOT_SUPPORTED;
+    break;
+  case MEMCACHED_CONNECTION_UDP:
+    rc= udp_connect(ptr, server_key);
+    break;
+  case MEMCACHED_CONNECTION_TCP:
     rc= tcp_connect(ptr, server_key);
-    switch (ptr->hosts[server_key].type)
-    {
-    case MEMCACHED_CONNECTION_UNKNOWN:
-      WATCHPOINT_ASSERT(0);
-      rc= MEMCACHED_NOT_SUPPORTED;
-      break;
-    case MEMCACHED_CONNECTION_UDP:
-      rc= udp_connect(ptr, server_key);
-      break;
-    case MEMCACHED_CONNECTION_TCP:
-      rc= tcp_connect(ptr, server_key);
-      break;
-    case MEMCACHED_CONNECTION_UNIX_SOCKET:
-      rc= unix_socket_connect(ptr, server_key);
-      break;
-    }
-
-    if (rc != MEMCACHED_SUCCESS)
-      WATCHPOINT_ERROR(rc);
+    break;
+  case MEMCACHED_CONNECTION_UNIX_SOCKET:
+    rc= unix_socket_connect(ptr, server_key);
+    break;
   }
-  else
-  {
-    unsigned int x;
-
-    for (x= 0; x < ptr->number_of_hosts; x++)
-    {
-      memcached_return possible_rc;
 
-      possible_rc= MEMCACHED_NOT_SUPPORTED; /* Remove warning */
+  if (rc != MEMCACHED_SUCCESS)
+    WATCHPOINT_ERROR(rc);
 
-      switch (ptr->hosts[x].type)
-      {
-      case MEMCACHED_CONNECTION_UNKNOWN:
-        WATCHPOINT_ASSERT(0);
-        possible_rc= MEMCACHED_NOT_SUPPORTED;
-        break;
-      case MEMCACHED_CONNECTION_UDP:
-        possible_rc= udp_connect(ptr, x);
-        break;
-      case MEMCACHED_CONNECTION_TCP:
-        possible_rc= tcp_connect(ptr, x);
-        break;
-      case MEMCACHED_CONNECTION_UNIX_SOCKET:
-        possible_rc= unix_socket_connect(ptr, x);
-        break;
-      }
-      rc= MEMCACHED_SUCCESS;
-
-      if (possible_rc != MEMCACHED_SUCCESS)
-      {
-        WATCHPOINT_ERROR(possible_rc);
-        rc= MEMCACHED_SOME_ERRORS;
-      }
-    }
-  }
   LIBMEMCACHED_MEMCACHED_CONNECT_END();
 
   return rc;
index af2303ca6d41a3657ad5a0ad3c4bbe5a8f753953..5fa5d960264ed02a54e4a83777104b5f612d759a 100644 (file)
@@ -8,13 +8,8 @@ memcached_return memcached_flush(memcached_st *ptr, time_t expiration)
   char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE];
   LIBMEMCACHED_MEMCACHED_FLUSH_START();
 
-  rc= memcached_connect(ptr, 0);
-
-  if (rc == MEMCACHED_NO_SERVERS)
-    return rc;
-
-  if (rc != MEMCACHED_SUCCESS)
-    rc= MEMCACHED_SOME_ERRORS;
+  if (ptr->number_of_hosts == 0)
+    return MEMCACHED_NO_SERVERS;
 
   for (x= 0; x < ptr->number_of_hosts; x++)
   {
@@ -25,20 +20,12 @@ memcached_return memcached_flush(memcached_st *ptr, time_t expiration)
       send_length= snprintf(buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, 
                             "flush_all\r\n");
 
-    if (send_length >= MEMCACHED_DEFAULT_COMMAND_SIZE)
-      return MEMCACHED_WRITE_FAILURE;
-
     rc= memcached_do(ptr, x, buffer, send_length, 1);
-    if (rc != MEMCACHED_SUCCESS)
-      goto error;
-
-    rc= memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, x);
 
-    if (rc != MEMCACHED_SUCCESS)
-      rc= MEMCACHED_SOME_ERRORS;
+    if (rc == MEMCACHED_SUCCESS)
+      (void)memcached_response(ptr, buffer, MEMCACHED_DEFAULT_COMMAND_SIZE, x);
   }
 
-error:
   LIBMEMCACHED_MEMCACHED_FLUSH_END();
-  return rc;
+  return MEMCACHED_SUCCESS;
 }
index 38f6865b53a90d440a6771658c4800ad3d91a0f3..c5156439f9dc09166d77f3e414972faa27b1dcfd 100644 (file)
@@ -358,6 +358,8 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr,
   if (result == NULL)
     result= memcached_result_create(ptr, NULL);
 
+  WATCHPOINT_ASSERT(result->value.is_allocated != MEMCACHED_USED);
+
   while (ptr->cursor_server < ptr->number_of_hosts)
   {
     if (!ptr->hosts[ptr->cursor_server].cursor_active)
@@ -395,11 +397,10 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr,
     {
       return result;
     }
-
   }
 
 error:
-  memcached_result_free(result);
+  memcached_string_reset(&result->value);
 
   return NULL;
 }
index 33c1055bbfd70ffd60aa1e902739367136b08705..32e82e76d8623c99ddb89d3d657dfde32c192d50 100644 (file)
@@ -86,7 +86,13 @@ unsigned int memcached_generate_hash(memcached_st *ptr, char *key, size_t key_le
     return 0;
   }
   else
-    return hash % ptr->number_of_hosts;
+  {
+    unsigned int server_key;
+
+    server_key= hash % ptr->number_of_hosts;
+
+    return server_key;
+  }
 }
 
 static uint64_t internal_generate_hash(char *key, size_t key_length)
index 9e9c667317b6d80c1dfc02ed107dd21ffa96e640..bd9e29c755ba17124789a8cc40a5016a3530e9a1 100644 (file)
@@ -16,6 +16,7 @@ static void host_reset(memcached_server_st *host, char *new_hostname, unsigned i
   host->type= type;
   host->read_ptr= host->read_buffer;
   host->write_ptr= host->write_buffer;
+  host->sockaddr_inited= MEMCACHED_NOT_ALLOCATED;
 }
 
 memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *list)
index 49f44b23397e353bc64e42b6f70521274991a3bc..89de40301552ff891ca908b481068edd822f6692 100644 (file)
@@ -34,8 +34,13 @@ memcached_result_st *memcached_result_create(memcached_st *memc,
 
 void memcached_result_free(memcached_result_st *ptr)
 {
+  if (ptr == NULL)
+    return;
+
   memcached_string_free(&ptr->value);
 
   if (ptr->is_allocated == MEMCACHED_ALLOCATED)
     free(ptr);
+  else
+    ptr->is_allocated= MEMCACHED_USED;
 }
index 7b48afeedea1e29a5b1146004ee73a59040324bc..93968ad982dc87d17924f5835b7f9a61bbb0b53d 100644 (file)
@@ -62,12 +62,6 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   if (key_length == 0)
     return MEMCACHED_NO_KEY_PROVIDED;
 
-  /* Leaving this WATCHPOINT_ASSERT in since only a library fubar could blow this */
-#ifdef NOT_DONE
-  if (!(ptr->flags & MEM_NO_BLOCK) && ptr->write_buffer_offset != 0)
-    WATCHPOINT_ASSERT(0);
-#endif
-
   if (ptr->hosts == NULL || ptr->number_of_hosts == 0)
     return MEMCACHED_NO_SERVERS;
     
index 42f3c326767f112c3ed071fd9a8b215bff85a7df..300f10f2bc459967ee3ff66d1830830f4fd2095b 100644 (file)
@@ -70,6 +70,8 @@ memcached_return memcached_string_append_character(memcached_string_st *string,
 {
   memcached_return rc;
 
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   rc=  memcached_string_check(string, 1);
 
   if (rc != MEMCACHED_SUCCESS)
@@ -86,6 +88,8 @@ memcached_return memcached_string_append(memcached_string_st *string,
 {
   memcached_return rc;
 
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   rc= memcached_string_check(string, length);
 
   if (rc != MEMCACHED_SUCCESS)
@@ -103,6 +107,8 @@ memcached_return memcached_string_append(memcached_string_st *string,
 
 size_t memcached_string_backspace(memcached_string_st *string, size_t remove)
 {
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   if (string->end - string->string  > remove)
   {
     size_t difference;
@@ -120,6 +126,9 @@ size_t memcached_string_backspace(memcached_string_st *string, size_t remove)
 char *memcached_string_c_copy(memcached_string_st *string)
 {
   char *c_ptr;
+
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
+
   c_ptr= (char *)malloc(memcached_string_length(string) * sizeof(char));
   if (!c_ptr)
     return NULL;
@@ -131,15 +140,22 @@ char *memcached_string_c_copy(memcached_string_st *string)
 
 memcached_return memcached_string_reset(memcached_string_st *string)
 {
+  WATCHPOINT_ASSERT(string->is_allocated != MEMCACHED_USED);
   string->end= string->string;
   
   return MEMCACHED_SUCCESS;
 }
 
-void memcached_string_free(memcached_string_st *string)
+void memcached_string_free(memcached_string_st *ptr)
 {
-  if (string->string)
-    free(string->string);
-  if (string->is_allocated == MEMCACHED_ALLOCATED)
-    free(string);
+  if (ptr == NULL)
+    return;
+
+  if (ptr->string)
+    free(ptr->string);
+
+  if (ptr->is_allocated == MEMCACHED_ALLOCATED)
+    free(ptr);
+  else
+    ptr->is_allocated= MEMCACHED_USED;
 }
index 640fbfe45d19c9147d8f1be845ad8964892ab18b..3e3b4af4889c7c98e4c4f0d7f73a276a9445a30d 100644 (file)
@@ -645,6 +645,7 @@ uint8_t mget_result_test(memcached_st *memc)
   {
     assert(results);
   }
+
   while ((results= memcached_fetch_result(memc, &results_obj, &rc)) != NULL)
   assert(!results);
   assert(rc == MEMCACHED_NOTFOUND);