Incoming update to Murmur
[m6w6/libmemcached] / libmemcached / memcached_hosts.c
index c52aa09621c51d549308385b5019c7ac8b0921fa..f7a7dfcfe38a925ad332c45f3172373d17661f5e 100644 (file)
@@ -2,7 +2,7 @@
 #include <math.h>
 
 /* Protoypes (static) */
-static memcached_return server_add(memcached_st *ptr, char *hostname, 
+static memcached_return server_add(memcached_st *ptr, const char *hostname, 
                                    unsigned int port,
                                    memcached_connection type);
 memcached_return update_continuum(memcached_st *ptr);
@@ -23,7 +23,7 @@ static int compare_servers(const void *p1, const void *p2)
   return return_value;
 }
 
-void sort_hosts(memcached_st *ptr)
+static void sort_hosts(memcached_st *ptr)
 {
   if (ptr->number_of_hosts)
   {
@@ -51,9 +51,9 @@ memcached_return run_distribution(memcached_st *ptr)
   return MEMCACHED_SUCCESS;
 }
 
-static void host_reset(memcached_st *ptr, memcached_server_st *host, 
-                       char *hostname, unsigned int port,
-                       memcached_connection type)
+void host_reset(memcached_st *ptr, memcached_server_st *host, 
+                const char *hostname, unsigned int port,
+                memcached_connection type)
 {
   memset(host,  0, sizeof(memcached_server_st));
   strncpy(host->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1);
@@ -89,9 +89,10 @@ void server_list_free(memcached_st *ptr, memcached_server_st *servers)
 
 static int continuum_item_cmp(const void *t1, const void *t2)
 {
-  memcached_continuum_item_st *ct1 = (memcached_continuum_item_st *)t1;
-  memcached_continuum_item_st *ct2 = (memcached_continuum_item_st *)t2;
+  memcached_continuum_item_st *ct1= (memcached_continuum_item_st *)t1;
+  memcached_continuum_item_st *ct2= (memcached_continuum_item_st *)t2;
 
+  /* Why 153? Hmmm... */
   WATCHPOINT_ASSERT(ct1->value != 153);
   if (ct1->value == ct2->value)
     return 0;
@@ -151,7 +152,11 @@ memcached_return update_continuum(memcached_st *ptr)
         float pct = (float)list[host_index].limit_maxbytes/ (float)total_mem_bytes;
         pointer_per_server= floorf( pct * MEMCACHED_POINTS_PER_SERVER * (float)(ptr->number_of_hosts));
 #ifdef HAVE_DEBUG
-        printf("ketama_weighted:%s|%d|%llu|%u\n", list[host_index].hostname, list[host_index].port,  list[host_index].limit_maxbytes, pointer_per_server);
+        printf("ketama_weighted:%s|%d|%llu|%u\n", 
+               list[host_index].hostname, 
+               list[host_index].port,  
+               (unsigned long long)list[host_index].limit_maxbytes, 
+               pointer_per_server);
 #endif
     }
     for(index= 1; index <= pointer_per_server; ++index) 
@@ -169,10 +174,13 @@ memcached_return update_continuum(memcached_st *ptr)
     pointer_counter+= pointer_per_server;
   }
 
+  WATCHPOINT_ASSERT(ptr);
+  WATCHPOINT_ASSERT(ptr->continuum);
+  WATCHPOINT_ASSERT(ptr->number_of_hosts);
   WATCHPOINT_ASSERT(ptr->number_of_hosts * MEMCACHED_POINTS_PER_SERVER <= MEMCACHED_CONTINUUM_SIZE);
-  qsort(ptr->continuum, ptr->number_of_hosts * MEMCACHED_POINTS_PER_SERVER, sizeof(memcached_continuum_item_st), continuum_item_cmp);
-
   ptr->continuum_points_counter= pointer_counter;
+  qsort(ptr->continuum, ptr->continuum_points_counter, sizeof(memcached_continuum_item_st), continuum_item_cmp);
+
   if (stat_p)
     memcached_stat_free(NULL, stat_p);
 
@@ -224,7 +232,7 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l
   return run_distribution(ptr);
 }
 
-memcached_return memcached_server_add_unix_socket(memcached_st *ptr, char *filename)
+memcached_return memcached_server_add_unix_socket(memcached_st *ptr, const char *filename)
 {
   if (!filename)
     return MEMCACHED_FAILURE;
@@ -233,7 +241,7 @@ memcached_return memcached_server_add_unix_socket(memcached_st *ptr, char *filen
 }
 
 memcached_return memcached_server_add_udp(memcached_st *ptr, 
-                                          char *hostname,
+                                          const char *hostname,
                                           unsigned int port)
 {
   if (!port)
@@ -246,7 +254,7 @@ memcached_return memcached_server_add_udp(memcached_st *ptr,
 }
 
 memcached_return memcached_server_add(memcached_st *ptr, 
-                                      char *hostname, 
+                                      const char *hostname, 
                                       unsigned int port)
 {
   if (!port)
@@ -258,7 +266,7 @@ memcached_return memcached_server_add(memcached_st *ptr,
   return server_add(ptr, hostname, port, MEMCACHED_CONNECTION_TCP);
 }
 
-static memcached_return server_add(memcached_st *ptr, char *hostname, 
+static memcached_return server_add(memcached_st *ptr, const char *hostname, 
                                    unsigned int port,
                                    memcached_connection type)
 {
@@ -282,8 +290,34 @@ static memcached_return server_add(memcached_st *ptr, char *hostname,
   return run_distribution(ptr);
 }
 
+memcached_return memcached_server_remove(memcached_server_st *st_ptr)
+{
+  uint32_t x, index;
+  memcached_st *ptr= st_ptr->root;
+  memcached_server_st *list= ptr->hosts;
+
+  for (x= 0, index= 0; x < ptr->number_of_hosts; x++) 
+  {
+    if (strncmp(list[x].hostname, st_ptr->hostname, MEMCACHED_MAX_HOST_LENGTH)!=0 || list[x].port != st_ptr->port) 
+    {
+      memcpy(list+index, list+x, sizeof(memcached_server_st));
+      index++;
+    } 
+  }
+  ptr->number_of_hosts= index;
+
+  if (st_ptr->address_info) 
+  {
+    freeaddrinfo(st_ptr->address_info);
+    st_ptr->address_info= NULL;
+  }
+  run_distribution(ptr);
+
+  return MEMCACHED_SUCCESS;
+}
+
 memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, 
-                                                  char *hostname, unsigned int port, 
+                                                  const char *hostname, unsigned int port, 
                                                   memcached_return *error)
 {
   unsigned int count;