X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=lib%2Fmemcached_hosts.c;h=88c255a59d2997222b67f83107fa11cca545665f;hb=9cfc3faa3f8471083350cecce7e49114ce827c89;hp=4b871d6ba1136e55b040fbfeef37f9736c8d54ca;hpb=128e13163e0f26383f888fe0bb284d569562ca6c;p=m6w6%2Flibmemcached diff --git a/lib/memcached_hosts.c b/lib/memcached_hosts.c index 4b871d6b..88c255a5 100644 --- a/lib/memcached_hosts.c +++ b/lib/memcached_hosts.c @@ -6,11 +6,36 @@ static memcached_return server_add(memcached_st *ptr, char *hostname, unsigned int port, memcached_connection type); +#define MEMCACHED_WHEEL_SIZE 1024 +#define MEMCACHED_STRIDE 4 +static void rebalance_wheel(memcached_st *ptr) +{ + unsigned int x; + unsigned int y; + unsigned int latch; + + /* Seed the Wheel */ + memset(ptr->wheel, 0, sizeof(unsigned int) * MEMCACHED_WHEEL_SIZE); + + for (latch= y= x= 0; x < MEMCACHED_WHEEL_SIZE; x++, latch++) + { + if (latch == MEMCACHED_STRIDE) + { + y++; + if (y == ptr->number_of_hosts) + y= 0; + latch= 0; + } + + ptr->wheel[x]= y; + } +} + static void host_reset(memcached_server_st *host, char *hostname, unsigned int port, memcached_connection type) { memset(host, 0, sizeof(memcached_server_st)); - memcpy(host->hostname, hostname, strlen(hostname)); + strncpy(host->hostname, hostname, MEMCACHED_MAX_HOST_LENGTH - 1); host->port= port; host->fd= -1; host->type= type; @@ -41,13 +66,15 @@ memcached_return memcached_server_push(memcached_st *ptr, memcached_server_st *l for (x= 0; x < count; x++) { - WATCHPOINT_ASSERT(list[x].hostname[0] == 0); + WATCHPOINT_ASSERT(list[x].hostname[0] != 0); host_reset(&ptr->hosts[ptr->number_of_hosts], list[x].hostname, list[x].port, list[x].type); ptr->number_of_hosts++; } ptr->hosts[0].count= ptr->number_of_hosts; + rebalance_wheel(ptr); + return MEMCACHED_SUCCESS; } @@ -104,6 +131,8 @@ static memcached_return server_add(memcached_st *ptr, char *hostname, ptr->number_of_hosts++; ptr->hosts[0].count++; + rebalance_wheel(ptr); + LIBMEMCACHED_MEMCACHED_SERVER_ADD_END(); return MEMCACHED_SUCCESS; @@ -116,8 +145,8 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, unsigned int count; memcached_server_st *new_host_list; - if (!hostname) - return ptr; + if (hostname == NULL || error == NULL) + return NULL; if (!port) port= MEMCACHED_DEFAULT_PORT; @@ -146,7 +175,6 @@ memcached_server_st *memcached_server_list_append(memcached_server_st *ptr, unsigned int memcached_server_list_count(memcached_server_st *ptr) { - if (ptr == NULL) return 0; @@ -160,5 +188,9 @@ void memcached_server_list_free(memcached_server_st *ptr) if (ptr == NULL) return; + for (x= 0; x < ptr->count; x++) + if (ptr[x].address_info) + freeaddrinfo(ptr[x].address_info); + free(ptr); }