From: Brian Aker Date: Sun, 16 Dec 2012 07:14:08 +0000 (-0500) Subject: Add small ketama test. X-Git-Tag: 1.0.15~1^2~1 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=8bfabdeae9c1ec345c88ca5325c003165212f8b6;p=m6w6%2Flibmemcached Add small ketama test. --- diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 886476f6..b1f1327c 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -79,10 +79,10 @@ static bool repack_input_buffer(org::libmemcached::Instance* ptr) do { /* Just try a single read to grab what's available */ ssize_t nr; - if ((nr= recv(ptr->fd, + if ((nr= ::recv(ptr->fd, ptr->read_ptr + ptr->read_data_length, MEMCACHED_MAX_BUFFER - ptr->read_data_length, - MSG_DONTWAIT)) <= 0) + MSG_DONTWAIT|MSG_NOSIGNAL)) <= 0) { if (nr == 0) { @@ -419,7 +419,7 @@ static memcached_return_t _io_fill(org::libmemcached::Instance* ptr) ssize_t data_read; do { - data_read= ::recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT); + data_read= ::recv(ptr->fd, ptr->read_buffer, MEMCACHED_MAX_BUFFER, MSG_DONTWAIT|MSG_NOSIGNAL); if (data_read == SOCKET_ERROR) { switch (get_socket_errno()) @@ -557,7 +557,7 @@ memcached_return_t memcached_io_slurp(org::libmemcached::Instance* ptr) char buffer[MEMCACHED_MAX_BUFFER]; do { - data_read= recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT); + data_read= ::recv(ptr->fd, ptr->read_buffer, sizeof(buffer), MSG_DONTWAIT|MSG_NOSIGNAL); if (data_read == SOCKET_ERROR) { switch (get_socket_errno()) diff --git a/tests/include.am b/tests/include.am index 288e276b..7e924604 100644 --- a/tests/include.am +++ b/tests/include.am @@ -21,7 +21,7 @@ noinst_HEADERS+= tests/keys.hpp noinst_HEADERS+= tests/libmemcached_test_container.h noinst_HEADERS+= tests/libmemcached_world.h noinst_HEADERS+= tests/libmemcached_world_socket.h -noinst_HEADERS+= tests/memc.h +noinst_HEADERS+= tests/memc.hpp noinst_HEADERS+= tests/runner.h # Cycle should always run first diff --git a/tests/libmemcached-1.0/all_tests.h b/tests/libmemcached-1.0/all_tests.h index 2da9c7e3..18a55f97 100644 --- a/tests/libmemcached-1.0/all_tests.h +++ b/tests/libmemcached-1.0/all_tests.h @@ -346,6 +346,7 @@ test_st hash_sanity[] ={ #endif test_st ketama_auto_eject_hosts[] ={ + {"basic ketama test", true, (test_callback_fn*)ketama_TEST }, {"auto_eject_hosts", true, (test_callback_fn*)auto_eject_hosts }, {"output_ketama_weighted_keys", true, (test_callback_fn*)output_ketama_weighted_keys }, {0, 0, (test_callback_fn*)0} diff --git a/tests/libmemcached-1.0/mem_functions.cc b/tests/libmemcached-1.0/mem_functions.cc index 49be55da..81d63506 100644 --- a/tests/libmemcached-1.0/mem_functions.cc +++ b/tests/libmemcached-1.0/mem_functions.cc @@ -86,6 +86,7 @@ using namespace libtest; #include "tests/libmemcached-1.0/setup_and_teardowns.h" #include "tests/print.h" #include "tests/debug.h" +#include "tests/memc.hpp" #define UUID_STRING_MAXLENGTH 36 @@ -2764,6 +2765,25 @@ test_return_t user_supplied_bug21(memcached_st *memc) return TEST_SUCCESS; } +test_return_t ketama_TEST(memcached_st *) +{ + test::Memc memc("--server=10.0.1.1:11211 --server=10.0.1.2:11211"); + + test_compare(MEMCACHED_SUCCESS, + memcached_behavior_set(&memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED, true)); + + test_compare(memcached_behavior_get(&memc, MEMCACHED_BEHAVIOR_KETAMA_WEIGHTED), uint64_t(1)); + + test_compare(memcached_behavior_set(&memc, MEMCACHED_BEHAVIOR_KETAMA_HASH, MEMCACHED_HASH_MD5), MEMCACHED_SUCCESS); + + test_compare(memcached_behavior_get(&memc, MEMCACHED_BEHAVIOR_KETAMA_HASH), MEMCACHED_HASH_MD5); + + test_compare(memcached_behavior_set_distribution(&memc, MEMCACHED_DISTRIBUTION_CONSISTENT_KETAMA_SPY), MEMCACHED_SUCCESS); + + + return TEST_SUCCESS; +} + test_return_t output_ketama_weighted_keys(memcached_st *) { memcached_st *memc= memcached_create(NULL); diff --git a/tests/libmemcached-1.0/mem_functions.h b/tests/libmemcached-1.0/mem_functions.h index b3c0bf57..374bc9c4 100644 --- a/tests/libmemcached-1.0/mem_functions.h +++ b/tests/libmemcached-1.0/mem_functions.h @@ -117,6 +117,7 @@ test_return_t murmur_run (memcached_st *); test_return_t murmur3_TEST(hashkit_st *); test_return_t noreply_test(memcached_st *memc); test_return_t one_at_a_time_run (memcached_st *); +test_return_t ketama_TEST(memcached_st *); test_return_t output_ketama_weighted_keys(memcached_st *); test_return_t libmemcached_util_ping_TEST(memcached_st*); test_return_t prepend_test(memcached_st *memc); diff --git a/tests/memc.h b/tests/memc.h deleted file mode 100644 index fbe42c51..00000000 --- a/tests/memc.h +++ /dev/null @@ -1,80 +0,0 @@ -/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: - * - * Gearmand client and server library. - * - * Copyright (C) 2011 Data Differential, http://datadifferential.com/ - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above - * copyright notice, this list of conditions and the following disclaimer - * in the documentation and/or other materials provided with the - * distribution. - * - * * The names of its contributors may not be used to endorse or - * promote products derived from this software without specific prior - * written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - * - */ - -#pragma once - -class Memc { -public: - Memc() - { - _memc= memcached_create(NULL); - - if (_memc == NULL) - { - throw "memcached_create() failed"; - } - } - - Memc(memcached_st* arg) - { - _memc= memcached_clone(NULL, arg); - - if (_memc == NULL) - { - throw "memcached_clone() failed"; - } - } - - memcached_st* operator&() const - { - return _memc; - } - - memcached_st* operator->() const - { - return _memc; - } - - ~Memc() - { - memcached_free(_memc); - } - -private: - memcached_st *_memc; - -}; diff --git a/tests/memc.hpp b/tests/memc.hpp new file mode 100644 index 00000000..5e7621b8 --- /dev/null +++ b/tests/memc.hpp @@ -0,0 +1,104 @@ +/* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: + * + * Libmemcached library + * + * Copyright (C) 2012 Data Differential, http://datadifferential.com/ + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: + * + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * * Redistributions in binary form must reproduce the above + * copyright notice, this list of conditions and the following disclaimer + * in the documentation and/or other materials provided with the + * distribution. + * + * * The names of its contributors may not be used to endorse or + * promote products derived from this software without specific prior + * written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + */ + +#pragma once + +namespace test { + +class Memc { +public: + Memc() + { + _memc= memcached_create(NULL); + + if (_memc == NULL) + { + throw "memcached_create() failed"; + } + } + + Memc(const memcached_st* arg) + { + _memc= memcached_clone(NULL, arg); + + if (_memc == NULL) + { + throw "memcached_clone() failed"; + } + } + + Memc(const std::string& arg) + { + _memc= memcached(arg.c_str(), arg.size()); + if (_memc == NULL) + { + throw "memcached() failed"; + } + } + + Memc(in_port_t arg) + { + _memc= memcached_create(NULL); + + if (_memc == NULL) + { + throw "memcached_create() failed"; + } + memcached_server_add(_memc, "localhost", arg); + } + + memcached_st* operator&() const + { + return _memc; + } + + memcached_st* operator->() const + { + return _memc; + } + + ~Memc() + { + memcached_free(_memc); + } + +private: + memcached_st *_memc; + +}; + +} // namespace test diff --git a/tests/runner.h b/tests/runner.h index 0d1a767d..9ec65c06 100644 --- a/tests/runner.h +++ b/tests/runner.h @@ -39,7 +39,7 @@ #pragma once #include "tests/libmemcached-1.0/generate.h" -#include "tests/memc.h" +#include "tests/memc.hpp" #include "tests/print.h" class LibmemcachedRunner : public libtest::Runner { @@ -56,7 +56,7 @@ public: test_return_t flush(libmemcached_test_container_st *container) { - Memc memc(container->parent()); + test::Memc memc(container->parent()); memcached_flush(&memc, 0); memcached_quit(&memc); @@ -78,7 +78,7 @@ private: { test_true(container); test_true(container->parent()); - Memc memc(container->parent()); + test::Memc memc(container->parent()); test_compare(true, check());