From 8bfabdeae9c1ec345c88ca5325c003165212f8b6 Mon Sep 17 00:00:00 2001 From: Brian Aker Date: Sun, 16 Dec 2012 02:14:08 -0500 Subject: [PATCH] Add small ketama test. --- libmemcached/io.cc | 8 +++---- tests/include.am | 2 +- tests/libmemcached-1.0/all_tests.h | 1 + tests/libmemcached-1.0/mem_functions.cc | 20 +++++++++++++++++ tests/libmemcached-1.0/mem_functions.h | 1 + tests/{memc.h => memc.hpp} | 30 ++++++++++++++++++++++--- tests/runner.h | 6 ++--- 7 files changed, 57 insertions(+), 11 deletions(-) rename tests/{memc.h => memc.hpp} (80%) 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.hpp similarity index 80% rename from tests/memc.h rename to tests/memc.hpp index fbe42c51..5e7621b8 100644 --- a/tests/memc.h +++ b/tests/memc.hpp @@ -1,8 +1,8 @@ /* vim:expandtab:shiftwidth=2:tabstop=2:smarttab: * - * Gearmand client and server library. + * Libmemcached library * - * Copyright (C) 2011 Data Differential, http://datadifferential.com/ + * Copyright (C) 2012 Data Differential, http://datadifferential.com/ * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -37,6 +37,8 @@ #pragma once +namespace test { + class Memc { public: Memc() @@ -49,7 +51,7 @@ public: } } - Memc(memcached_st* arg) + Memc(const memcached_st* arg) { _memc= memcached_clone(NULL, arg); @@ -59,6 +61,26 @@ public: } } + 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; @@ -78,3 +100,5 @@ 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()); -- 2.30.2