break;
case OPT_BINARY_PROTOCOL: /* --binary or -B */
- ms_setting.binary_prot= true;
+ ms_setting.binary_prot_= true;
break;
case OPT_TPS: /* --tps or -P */
/* the loop of the main thread, wait the work threads to complete */
static void ms_monitor_slap_mode()
{
- int second= 0;
struct timeval start_time, end_time;
/* Wait all the threads complete initialization. */
/* running in "run time" mode, user specify run time */
if (ms_setting.run_time > 0)
{
+ int second= 0;
gettimeofday(&start_time, NULL);
while (1)
{
if ((file_buffer_ptr= (char *)malloc(sizeof(char) * (size_t)sbuf.st_size)) == NULL)
{
std::cerr << "Error allocating file buffer(" << strerror(errno) << ")" << std::endl;
+ close(fd);
exit(EXIT_FAILURE);
}
if ((read_length= ::read(fd, file_buffer_ptr, (size_t)sbuf.st_size)) == -1)
{
std::cerr << "Error while reading file " << file_buffer_ptr << " (" << strerror(errno) << ")" << std::endl;
+ close(fd);
exit(EXIT_FAILURE);
}
if (read_length != sbuf.st_size)
{
std::cerr << "Failure while reading file. Read length was not equal to stat() length" << std::endl;
+ close(fd);
exit(EXIT_FAILURE);
}
c->mlget_task.mlget_num= 0;
c->mlget_task.value_index= -1; /* default invalid value */
- if (ms_setting.binary_prot)
+ if (ms_setting.binary_prot_)
{
c->protocol= binary_prot;
}
exit(1);
}
- if (! ms_setting.binary_prot
+ if (! ms_setting.binary_prot_
&& ((start_len > MAX_KEY_SIZE) || (end_len > MAX_KEY_SIZE)))
{
fprintf(stderr, "key length must be less than 250 bytes.\n");
ms_setting.reconnect= false;
ms_setting.verbose= false;
ms_setting.facebook_test= false;
- ms_setting.binary_prot= false;
+ ms_setting.binary_prot_= false;
ms_setting.stat_freq= 0;
ms_setting.srv_str= NULL;
ms_setting.cfg_file= NULL;
bool verbose; /* whether it outputs detailed information when verification */
bool facebook_test; /* facebook test, TCP set and multi-get with UDP */
uint32_t sock_per_conn; /* number of socks per connection structure */
- bool binary_prot; /* whether it use binary protocol */
+ bool binary_prot_; /* whether it use binary protocol */
int expected_tps; /* expected throughput */
uint32_t rep_write_srv; /* which servers are used to do replication writing */
} ms_setting_st;
double global_std= 0;
double global_log= 0;
- uint64_t diff_time= 0;
- uint64_t diff_events= 0;
- double diff_squares= 0;
- double diff_log_product= 0;
double period_average= 0;
uint64_t period_tps= 0;
double period_rate= 0;
* global_average) / (double)(events - 1));
global_log= exp(stat->log_product / (double)events);
- diff_time= stat->total_time - stat->pre_total_time;
- diff_events= events - stat->pre_events;
+ uint64_t diff_time= stat->total_time - stat->pre_total_time;
+ uint64_t diff_events= events - stat->pre_events;
if (diff_events >= 1)
{
period_average= (double)(diff_time / diff_events);
period_tps= diff_events / (uint64_t)freq;
period_rate= (double)diff_events * obj_size / 1024 / 1024 / freq;
- diff_squares= (double)stat->squares - (double)stat->pre_squares;
+ double diff_squares= (double)stat->squares - (double)stat->pre_squares;
period_std= sqrt((diff_squares - (double)diff_events * period_average
* period_average) / (double)(diff_events - 1));
- diff_log_product= stat->log_product - stat->pre_log_product;
+ double diff_log_product= stat->log_product - stat->pre_log_product;
period_log= exp(diff_log_product / (double)diff_events);
}
memcached_result_st result;
struct {
- bool weighted;
+ bool weighted_;
uint32_t continuum_count; // Ketama
uint32_t continuum_points_counter; // Ketama
time_t next_distribution_rebuild; // Ketama
- memcached_continuum_item_st *continuum; // Ketama
+ struct memcached_continuum_item_st *continuum; // Ketama
} ketama;
struct memcached_virtual_bucket_t *virtual_bucket;
// The following two structures are internal, and never exposed to users.
typedef struct memcached_string_st memcached_string_st;
typedef struct memcached_string_t memcached_string_t;
-typedef struct memcached_continuum_item_st memcached_continuum_item_st;
#endif
#include <ctime>
#include <sys/types.h>
-static bool __is_ketama(memcached_st *ptr)
+bool memcached_is_consistent_distribution(const memcached_st* memc)
{
- switch (ptr->distribution)
+ switch (memc->distribution)
{
case MEMCACHED_DISTRIBUTION_CONSISTENT:
case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA:
return ptr->flags.verify_key;
case MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED:
- if (__is_ketama(ptr))
+ if (memcached_is_consistent_distribution(ptr))
{
- return ptr->ketama.weighted;
+ return memcached_is_weighted_ketama(ptr);
}
return false;
return ptr->distribution;
case MEMCACHED_BEHAVIOR_KETAMA:
- return __is_ketama(ptr);
+ return memcached_is_consistent_distribution(ptr);
case MEMCACHED_BEHAVIOR_HASH:
return hashkit_get_function(&ptr->hashkit);
case MEMCACHED_DISTRIBUTION_CONSISTENT:
case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA:
- ptr->ketama.weighted= false;
+ memcached_set_weighted_ketama(ptr, false);
break;
case MEMCACHED_DISTRIBUTION_RANDOM:
break;
case MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED:
- ptr->ketama.weighted= true;
+ memcached_set_weighted_ketama(ptr, true);
break;
case MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET:
#pragma once
+bool memcached_is_consistent_distribution(const memcached_st*);
bool _is_auto_eject_host(const memcached_st *ptr);
/* Why 153? Hmmm... */
WATCHPOINT_ASSERT(ct1->value != 153);
if (ct1->value == ct2->value)
+ {
return 0;
+ }
else if (ct1->value > ct2->value)
+ {
return 1;
+ }
else
+ {
return -1;
+ }
}
static memcached_return_t update_continuum(memcached_st *ptr)
live_servers= memcached_server_count(ptr);
}
- uint64_t is_ketama_weighted= memcached_behavior_get(ptr, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED);
- uint32_t points_per_server= (uint32_t) (is_ketama_weighted ? MEMCACHED_POINTS_PER_SERVER_KETAMA : MEMCACHED_POINTS_PER_SERVER);
+ uint32_t points_per_server= (uint32_t) (memcached_is_weighted_ketama(ptr) ? MEMCACHED_POINTS_PER_SERVER_KETAMA : MEMCACHED_POINTS_PER_SERVER);
if (live_servers == 0)
{
}
uint64_t total_weight= 0;
- if (is_ketama_weighted)
+ if (memcached_is_weighted_ketama(ptr))
{
for (uint32_t host_index = 0; host_index < memcached_server_count(ptr); ++host_index)
{
continue;
}
- if (is_ketama_weighted)
+ if (memcached_is_weighted_ketama(ptr))
{
float pct= (float)list[host_index].weight / (float)total_weight;
pointer_per_server= (uint32_t) ((::floor((float) (pct * MEMCACHED_POINTS_PER_SERVER_KETAMA / 4 * (float)live_servers + 0.0000000001))) * 4);
fprintf(stdout, "update_continuum: key is %s\n", sort_host);
}
- if (is_ketama_weighted)
+ if (memcached_is_weighted_ketama(ptr))
{
for (uint32_t x= 0; x < pointer_per_hash; x++)
{
memcached_literal_param("snprintf(sizeof(sort_host)))"));
}
- if (is_ketama_weighted)
+ if (memcached_is_weighted_ketama(ptr))
{
for (uint32_t x = 0; x < pointer_per_hash; x++)
{
if (weight > 1)
{
- ptr->ketama.weighted= true;
+ if (memcached_is_consistent_distribution(ptr))
+ {
+ memcached_set_weighted_ketama(ptr, true);
+ }
}
ptr->number_of_hosts++;
if (list[x].weight > 1)
{
- ptr->ketama.weighted= true;
+ memcached_set_weighted_ketama(ptr, true);
}
ptr->number_of_hosts++;
if (list[x].weight > 1)
{
- ptr->ketama.weighted= true;
+ memcached_set_weighted_ketama(ptr, true);
}
ptr->number_of_hosts++;
noinst_HEADERS+= libmemcached/array.h
noinst_HEADERS+= libmemcached/assert.hpp
noinst_HEADERS+= libmemcached/backtrace.hpp
+noinst_HEADERS+= libmemcached/behavior.hpp
noinst_HEADERS+= libmemcached/byteorder.h
noinst_HEADERS+= libmemcached/common.h
noinst_HEADERS+= libmemcached/connect.hpp
libmemcached_libmemcached_la_SOURCES+= libmemcached/auto.cc
libmemcached_libmemcached_la_SOURCES+= libmemcached/backtrace.cc
libmemcached_libmemcached_la_SOURCES+= libmemcached/behavior.cc
-libmemcached_libmemcached_la_SOURCES+= libmemcached/behavior.hpp
libmemcached_libmemcached_la_SOURCES+= libmemcached/byteorder.cc
libmemcached_libmemcached_la_SOURCES+= libmemcached/callback.cc
libmemcached_libmemcached_la_SOURCES+= libmemcached/connect.cc
WATCHPOINT_ASSERT(ptr->fd != INVALID_SOCKET);
WATCHPOINT_ASSERT(write_length > 0);
- int flags= with_flush ? MSG_NOSIGNAL|MSG_DONTWAIT : MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE;
+ int flags;
+ if (with_flush)
+ {
+ flags= MSG_NOSIGNAL|MSG_DONTWAIT;
+ }
+ else
+ {
+ flags= MSG_NOSIGNAL|MSG_DONTWAIT|MSG_MORE;
+ }
+
ssize_t sent_length= ::send(ptr->fd, local_write_ptr, write_length, flags);
if (sent_length == SOCKET_ERROR)
#define memcached_is_auto_eject_hosts(__object) ((__object)->flags.auto_eject_hosts)
#define memcached_is_use_sort_hosts(__object) ((__object)->flags.use_sort_hosts)
+#define memcached_is_weighted_ketama(__object) ((__object)->ketama.weighted_)
+
#define memcached_set_aes(__object, __flag) ((__object).flags.is_aes= __flag)
#define memcached_set_udp(__object, __flag) ((__object).flags.use_udp= __flag)
#define memcached_set_verify_key(__object, __flag) ((__object).flags.verify_key= __flag)
#define memcached_set_processing_input(__object, __value) ((__object)->state.is_processing_input= (__value))
#define memcached_set_initialized(__object, __value) ((__object)->options.is_initialized(= (__value))
#define memcached_set_allocated(__object, __value) ((__object)->options.is_allocated= (__value))
+
+#define memcached_set_weighted_ketama(__object, __value) ((__object)->ketama.weighted_= (__value))
self->ketama.continuum_count= 0;
self->ketama.continuum_points_counter= 0;
self->ketama.next_distribution_rebuild= 0;
- self->ketama.weighted= false;
+ self->ketama.weighted_= false;
self->number_of_hosts= 0;
self->servers= NULL;
#if 0
*error= memcached_set_errno(*ptr, MEMCACHED_MEMORY_ALLOCATION_FAILURE, MEMCACHED_AT);
#endif
+ free(new_host_list);
return NULL;
}
{
for (libtest::vchar_ptr_t::iterator iter= _keys.begin();
iter != _keys.end();
- iter++)
+ ++iter)
{
::free(*iter);
}
else
{
// Assume a minimum of 3, and a maximum of 8
- world->servers().set_servers_to_run(libtest::number_of_cpus() > 3 ?
+ world->servers().set_servers_to_run((libtest::number_of_cpus() > 3) ?
std::min(libtest::number_of_cpus(), size_t(8)) : 3);
}
test_true(memc_clone->flags.buffer_requests == memc->flags.buffer_requests);
test_true(memc_clone->flags.use_sort_hosts == memc->flags.use_sort_hosts);
test_true(memc_clone->flags.verify_key == memc->flags.verify_key);
- test_true(memc_clone->ketama.weighted == memc->ketama.weighted);
+ test_true(memc_clone->ketama.weighted_ == memc->ketama.weighted_);
test_true(memc_clone->flags.binary_protocol == memc->flags.binary_protocol);
test_true(memc_clone->flags.hash_with_namespace == memc->flags.hash_with_namespace);
test_true(memc_clone->flags.reply == memc->flags.reply);
for (libtest::vchar_ptr_t::iterator iter= keys.begin();
iter != keys.end();
- iter++)
+ ++iter)
{
test_compare_hint(MEMCACHED_SUCCESS,
memcached_set(memc,