If you call sort, a quit occurs, and the current servers get sorted.
author <brian@gir.tangent.org> <>
Fri, 4 Apr 2008 07:49:51 +0000 (00:49 -0700)
committer <brian@gir.tangent.org> <>
Fri, 4 Apr 2008 07:49:51 +0000 (00:49 -0700)
libmemcached/common.h
libmemcached/memcached_behavior.c
libmemcached/memcached_hosts.c
tests/function.c

index 7e21afff48a740f1152b6cfff48e0baaf2358097..de55dbbebfc85bc5ea2375c25503962ad39a5fbf 100644 (file)
@@ -109,4 +109,6 @@ void server_list_free(memcached_st *ptr, memcached_server_st *servers);
 memcached_return memcachd_key_test(char **keys, size_t *key_length,
                                    unsigned int number_of_keys);
 
+void sort_hosts(memcached_st *ptr);
+
 #endif /* __COMMON_H__ */
index 677e022f9e4cd89df7ac98455cc255c7bcf1305d..1de8f4952a93b91de38e1a3caa5a3b46c2649f2b 100644 (file)
@@ -54,8 +54,17 @@ memcached_return memcached_behavior_set(memcached_st *ptr,
     set_behavior_flag(ptr, MEM_USE_KETAMA, data);
     break;
   case MEMCACHED_BEHAVIOR_SORT_HOSTS:
-    set_behavior_flag(ptr, MEM_USE_SORT_HOSTS, data);
-    break;
+    {
+      set_behavior_flag(ptr, MEM_USE_SORT_HOSTS, data);
+
+      if (ptr->flags & MEM_USE_SORT_HOSTS)
+      {
+        memcached_quit(ptr);
+        sort_hosts(ptr);
+      }
+
+      break;
+    }
   case MEMCACHED_BEHAVIOR_POLL_TIMEOUT:
     ptr->poll_timeout= (int32_t)data;
     break;
index d6832ef3d21e3a1dacba8286d0c3d9d7152214fc..87a8cbd3058dfd3937122ee6cfefab234322616d 100644 (file)
@@ -49,6 +49,11 @@ static int compare_servers(const void *p1, const void *p2)
   return return_value;
 }
 
+void sort_hosts(memcached_st *ptr)
+{
+  qsort(ptr->hosts, ptr->number_of_hosts, sizeof(memcached_server_st), compare_servers);
+}
+
 static void host_reset(memcached_st *ptr, memcached_server_st *host, 
                        char *hostname, unsigned int port,
                        memcached_connection type)
@@ -117,7 +122,7 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l
   ptr->hosts[0].count= ptr->number_of_hosts;
 
   if (ptr->number_of_hosts > 1 && ptr->flags & MEM_USE_SORT_HOSTS)
-    qsort(ptr->hosts, ptr->number_of_hosts, sizeof(memcached_server_st), compare_servers);
+    sort_hosts(ptr);
 
   rebalance_wheel(ptr);
 
@@ -181,7 +186,7 @@ static memcached_return server_add(memcached_st *ptr, char *hostname,
   ptr->number_of_hosts++;
 
   if (ptr->number_of_hosts > 1 && ptr->flags & MEM_USE_SORT_HOSTS)
-    qsort(ptr->hosts, ptr->number_of_hosts, sizeof(memcached_server_st), compare_servers);
+    sort_hosts(ptr);
 
   ptr->hosts[0].count= ptr->number_of_hosts;
 
index 777be74ca0fd375573eea5292d651d8b6d075bdb..03df4da2f6da50cc476510be50c698084937806e 100644 (file)
@@ -117,6 +117,7 @@ uint8_t server_unsort_test(memcached_st *ptr)
 {
   uint8_t x;
   uint32_t counter= 0; /* Prime the value for the assert in server_display_function */
+  uint32_t bigger= 0; /* Prime the value for the assert in server_display_function */
   memcached_return rc;
   memcached_server_function callbacks[1];
   memcached_st *local_memc;
@@ -136,6 +137,11 @@ uint8_t server_unsort_test(memcached_st *ptr)
   callbacks[0]= server_display_unsort_function;
   memcached_server_cursor(local_memc, callbacks, (void *)&counter,  1);
 
+  /* Now we sort old data! */
+  memcached_behavior_set(local_memc, MEMCACHED_BEHAVIOR_SORT_HOSTS, 1);
+  callbacks[0]= server_display_function;
+  memcached_server_cursor(local_memc, callbacks, (void *)&bigger,  1);
+
 
   memcached_free(local_memc);