Work on adding ketama style distribution.
author <brian@localhost.localdomain> <>
Sun, 20 Apr 2008 16:08:32 +0000 (09:08 -0700)
committer <brian@localhost.localdomain> <>
Sun, 20 Apr 2008 16:08:32 +0000 (09:08 -0700)
libmemcached/memcached_constants.h
libmemcached/memcached_hosts.c
libmemcached/memcached_storage.c
libmemcached/memcached_watchpoint.h

index b2b819f27f1dbb5893463400d6032c6acfb18931..237ff54d1a7c76ccc823d9f85154eb6ad56fe44b 100644 (file)
@@ -20,8 +20,8 @@ extern "C" {
 #define MEMCACHED_MAX_HOST_LENGTH 64
 #define MEMCACHED_MAX_HOST_SORT_LENGTH 86 /* Used for Ketama */
 #define MEMCACHED_WHEEL_SIZE 1024
-#define MEMCACHED_CONTINUUM_SIZE 2048 
 #define MEMCACHED_POINTS_PER_SERVER 100 
+#define MEMCACHED_CONTINUUM_SIZE MEMCACHED_POINTS_PER_SERVER*100 /* This would then set max hosts to 100 */ 
 #define MEMCACHED_STRIDE 4
 #define MEMCACHED_DEFAULT_TIMEOUT INT32_MAX
 
index 65dcc546224bdd09d6deeb388d4cdedc7f4b0fe2..3809feed54f4ff3f9760d64bb077f1729cf3dd61 100644 (file)
@@ -95,9 +95,11 @@ static int continuum_item_cmp(const void *t1, const void *t2)
 {
   struct continuum_item *ct1 = (struct continuum_item *)t1;
   struct continuum_item *ct2 = (struct continuum_item *)t2;
-  if(ct1->value == ct2->value)
+
+  WATCHPOINT_ASSERT(ct1->value != 153);
+  if (ct1->value == ct2->value)
     return 0;
-  else if(ct1->value > ct2->value)
+  else if (ct1->value > ct2->value)
     return 1;
   else
     return -1;
@@ -117,10 +119,10 @@ static uint32_t internal_generate_ketama_md5(char *key, size_t key_length)
 
 void update_continuum(memcached_st *ptr)
 {
-  int index;
-  int host_index;
-  int continuum_index= 0;
-  int value;
+  uint32_t index;
+  uint32_t host_index;
+  uint32_t continuum_index= 0;
+  uint32_t value;
   memcached_server_st *list = ptr->hosts;
 
   for (host_index = 0; host_index < ptr->number_of_hosts; ++host_index) 
@@ -139,11 +141,12 @@ void update_continuum(memcached_st *ptr)
     }
   }
 
+  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(struct continuum_item), continuum_item_cmp);
 #ifdef HAVE_DEBUG
-  for(index= 0; index < ptr->number_of_hosts * MEMCACHED_POINTS_PER_SERVER - 1; ++index
+  for (index= 0; index < ((ptr->number_of_hosts * MEMCACHED_POINTS_PER_SERVER) - 1); index++
   {
-    WATCHPOINT_ASSERT(ptr->continuum[index].value < ptr->continuum[index + 1].value);
+    WATCHPOINT_ASSERT(ptr->continuum[index].value <= ptr->continuum[index + 1].value);
   }
 #endif
 }
index 0f6daa4ec1fa2b5568ad762730c25ef8b1867ef8..30afd2634fc5a9406844b349b83443d1a29a6719 100644 (file)
@@ -58,7 +58,6 @@ static inline memcached_return memcached_send(memcached_st *ptr,
   unsigned int server_key;
 
   WATCHPOINT_ASSERT(!(value == NULL && value_length > 0));
-  WATCHPOINT_ASSERT(!(value && value_length == 0));
 
   unlikely (key_length == 0)
     return MEMCACHED_NO_KEY_PROVIDED;
index b0270b6177b8d9fda1060ea6f8cb446abb478fdb..03c2b16003c1a07257a4fe3e5a9934391d034f80 100644 (file)
@@ -23,6 +23,7 @@ extern "C" {
 #define WATCHPOINT_STRING_LENGTH(A,B) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %.*s\n", __FILE__, __LINE__,__func__,(int)B,A);fflush(stdout);
 #define WATCHPOINT_NUMBER(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %zu\n", __FILE__, __LINE__,__func__,(size_t)(A));fflush(stdout);
 #define WATCHPOINT_ERRNO(A) fprintf(stderr, "\nWATCHPOINT %s:%d (%s) %s\n", __FILE__, __LINE__,__func__, strerror(A));fflush(stdout);
+#define WATCHPOINT_ASSERT_PRINT(A,B,C) if(!(A)){fprintf(stderr, "\nWATCHPOINT ASSERT %s:%d (%s) ", __FILE__, __LINE__,__func__);fprintf(stderr, (B),(C));fprintf(stderr,"\n");fflush(stdout);}assert((A));
 #define WATCHPOINT_ASSERT(A) assert((A));
 #else
 #define WATCHPOINT
@@ -31,6 +32,7 @@ extern "C" {
 #define WATCHPOINT_STRING(A)
 #define WATCHPOINT_NUMBER(A)
 #define WATCHPOINT_ERRNO(A)
+#define WATCHPOINT_ASSERT_PRINT(A,B,C)
 #define WATCHPOINT_ASSERT(A)
 #endif
 #endif /* MEMCACHED_INTERNAL */