From 4e38a2eadb390c100cbc8e73bf257c49f6eeb7d8 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Tue, 10 Jul 2012 00:28:46 -0700 Subject: [PATCH] Update (clarify weighted usage). --- libmemcached-1.0/struct/memcached.h | 4 ++-- libmemcached-1.0/types.h | 1 - libmemcached/behavior.cc | 14 ++++++------- libmemcached/behavior.hpp | 1 + libmemcached/hosts.cc | 26 ++++++++++++++++--------- libmemcached/include.am | 2 +- libmemcached/is.h | 4 ++++ libmemcached/memcached.cc | 2 +- tests/libmemcached-1.0/mem_functions.cc | 2 +- 9 files changed, 34 insertions(+), 22 deletions(-) diff --git a/libmemcached-1.0/struct/memcached.h b/libmemcached-1.0/struct/memcached.h index 0b4f8976..63b07a00 100644 --- a/libmemcached-1.0/struct/memcached.h +++ b/libmemcached-1.0/struct/memcached.h @@ -100,11 +100,11 @@ struct memcached_st { 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; diff --git a/libmemcached-1.0/types.h b/libmemcached-1.0/types.h index bb7e1a65..dc61a819 100644 --- a/libmemcached-1.0/types.h +++ b/libmemcached-1.0/types.h @@ -81,6 +81,5 @@ typedef struct memcached_callback_st memcached_callback_st; // 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 diff --git a/libmemcached/behavior.cc b/libmemcached/behavior.cc index e8bcf857..c381a513 100644 --- a/libmemcached/behavior.cc +++ b/libmemcached/behavior.cc @@ -42,9 +42,9 @@ #include #include -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: @@ -355,9 +355,9 @@ uint64_t memcached_behavior_get(memcached_st *ptr, 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; @@ -365,7 +365,7 @@ uint64_t memcached_behavior_get(memcached_st *ptr, 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); @@ -522,7 +522,7 @@ memcached_return_t memcached_behavior_set_distribution(memcached_st *ptr, memcac case MEMCACHED_DISTRIBUTION_CONSISTENT: case MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA: - ptr->ketama.weighted= false; + memcached_set_weighted_ketama(ptr, false); break; case MEMCACHED_DISTRIBUTION_RANDOM: @@ -532,7 +532,7 @@ memcached_return_t memcached_behavior_set_distribution(memcached_st *ptr, memcac break; case MEMCACHED_DISTRIBUTION_CONSISTENT_WEIGHTED: - ptr->ketama.weighted= true; + memcached_set_weighted_ketama(ptr, true); break; case MEMCACHED_DISTRIBUTION_VIRTUAL_BUCKET: diff --git a/libmemcached/behavior.hpp b/libmemcached/behavior.hpp index ee38f97a..0b06c0ca 100644 --- a/libmemcached/behavior.hpp +++ b/libmemcached/behavior.hpp @@ -36,4 +36,5 @@ #pragma once +bool memcached_is_consistent_distribution(const memcached_st*); bool _is_auto_eject_host(const memcached_st *ptr); diff --git a/libmemcached/hosts.cc b/libmemcached/hosts.cc index 2a07a395..4875615f 100644 --- a/libmemcached/hosts.cc +++ b/libmemcached/hosts.cc @@ -118,11 +118,17 @@ static int continuum_item_cmp(const void *t1, const void *t2) /* 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) @@ -167,8 +173,7 @@ 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) { @@ -191,7 +196,7 @@ static memcached_return_t update_continuum(memcached_st *ptr) } 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) { @@ -209,7 +214,7 @@ static memcached_return_t update_continuum(memcached_st *ptr) 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); @@ -253,7 +258,7 @@ static memcached_return_t update_continuum(memcached_st *ptr) 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++) { @@ -301,7 +306,7 @@ static memcached_return_t update_continuum(memcached_st *ptr) 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++) { @@ -366,7 +371,10 @@ static memcached_return_t server_add(memcached_st *ptr, if (weight > 1) { - ptr->ketama.weighted= true; + if (memcached_is_consistent_distribution(ptr)) + { + memcached_set_weighted_ketama(ptr, true); + } } ptr->number_of_hosts++; @@ -411,7 +419,7 @@ memcached_return_t memcached_server_push(memcached_st *ptr, const memcached_serv if (list[x].weight > 1) { - ptr->ketama.weighted= true; + memcached_set_weighted_ketama(ptr, true); } ptr->number_of_hosts++; @@ -455,7 +463,7 @@ memcached_return_t memcached_instance_push(memcached_st *ptr, const struct org:: if (list[x].weight > 1) { - ptr->ketama.weighted= true; + memcached_set_weighted_ketama(ptr, true); } ptr->number_of_hosts++; diff --git a/libmemcached/include.am b/libmemcached/include.am index f3525df2..bfa2f140 100644 --- a/libmemcached/include.am +++ b/libmemcached/include.am @@ -16,6 +16,7 @@ nobase_include_HEADERS+= libmemcached/util.h 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 @@ -64,7 +65,6 @@ libmemcached_libmemcached_la_SOURCES+= libmemcached/array.c 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 diff --git a/libmemcached/is.h b/libmemcached/is.h index 3815a0ad..126bc9a7 100644 --- a/libmemcached/is.h +++ b/libmemcached/is.h @@ -59,6 +59,8 @@ #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) @@ -83,3 +85,5 @@ #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)) diff --git a/libmemcached/memcached.cc b/libmemcached/memcached.cc index 3504b23a..c52873ad 100644 --- a/libmemcached/memcached.cc +++ b/libmemcached/memcached.cc @@ -77,7 +77,7 @@ static inline bool _memcached_init(memcached_st *self) 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; diff --git a/tests/libmemcached-1.0/mem_functions.cc b/tests/libmemcached-1.0/mem_functions.cc index cba7c957..04db4728 100644 --- a/tests/libmemcached-1.0/mem_functions.cc +++ b/tests/libmemcached-1.0/mem_functions.cc @@ -390,7 +390,7 @@ test_return_t clone_test(memcached_st *memc) 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); -- 2.30.2