#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);
return return_value;
}
-void sort_hosts(memcached_st *ptr)
+static void sort_hosts(memcached_st *ptr)
{
if (ptr->number_of_hosts)
{
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);
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;
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)
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;
- memcached_stat_free(NULL, stat_p);
+ qsort(ptr->continuum, ptr->continuum_points_counter, sizeof(memcached_continuum_item_st), continuum_item_cmp);
+
+ if (stat_p)
+ memcached_stat_free(NULL, stat_p);
#ifdef HAVE_DEBUG
for (index= 0; index < ((ptr->number_of_hosts * MEMCACHED_POINTS_PER_SERVER) - 1); index++)
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;
}
memcached_return memcached_server_add_udp(memcached_st *ptr,
- char *hostname,
+ const char *hostname,
unsigned int port)
{
if (!port)
}
memcached_return memcached_server_add(memcached_st *ptr,
- char *hostname,
+ const char *hostname,
unsigned int port)
{
if (!port)
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)
{
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;