From: Continuous Integration Date: Sun, 2 Feb 2014 13:49:39 +0000 (-0800) Subject: Merge lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcache... X-Git-Tag: 1.0.18~7 X-Git-Url: https://git.m6w6.name/?a=commitdiff_plain;h=5356e466e864b310a0195b72ce232197827bbe4e;hp=eeb331250b498d8ba2c57d0646cb2953072a1a07;p=m6w6%2Flibmemcached Merge lp:~493pocbrcycmdw7yksonho9o2qzz-o18bz-d18ecat4t1b76tkfi3vttrkfngli/libmemcached/libmemcached Build: jenkins-Libmemcached-445 --- diff --git a/.quickly b/.quickly deleted file mode 100644 index 637e364c..00000000 --- a/.quickly +++ /dev/null @@ -1,5 +0,0 @@ -project = libmemcached -version = 0.4.2 -template = pandora-build -project-type = library -pandora-version = 0.175 diff --git a/ChangeLog b/ChangeLog index 5fbed160..19a44020 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,4 +1,5 @@ 1.0.18 +* MEMCACHED_BEHAVIOR_RETRY_TIMEOUT can now be set to zero. 1.0.17 Tue Apr 2 14:02:01 HST 2013 * Remove c++ namespace that was being exposed (the API should be plug compatible).. diff --git a/GNUmakefile b/GNUmakefile new file mode 100644 index 00000000..33ec5acc --- /dev/null +++ b/GNUmakefile @@ -0,0 +1,36 @@ +# -*-Makefile-*- +# +_bootstrap_Makefile := $(wildcard [M]akefile) +_bootstrap_config-status := $(wildcard config.status) + +ALL_RECURSIVE_TARGETS= + +ifneq ($(_bootstrap_Makefile),) + include Makefile +else + ifneq ($(_bt_config-status),) + $(srcdir)/config.status + $(MAKE) $(AM_MAKEFLAGS) configure + endif + +.DEFAULT_GOAL:= basic_build +srcdir= . + +configure: bootstrap.sh + @$(srcdir)/bootstrap.sh -a + +Makefile: configure + @$(srcdir)/bootstrap.sh -c + +.PHONY: basic_build +basic_build: Makefile + @$(MAKE) $(AM_MAKEFLAGS) +endif + +ALL_RECURSIVE_TARGETS+= $(AM_RECURSIVE_TARGETS) + +ifneq ($(word 2, $(MAKECMDGOALS)), ) +ifneq ($(filter $(ALL_RECURSIVE_TARGETS), $(MAKECMDGOALS)), ) +.NOTPARALLEL: +endif +endif diff --git a/Makefile.am b/Makefile.am index cc65cb78..7432e682 100644 --- a/Makefile.am +++ b/Makefile.am @@ -31,7 +31,6 @@ MAINTAINERCLEANFILES= DISTCLEANFILES+= aminclude.am -EXTRA_DIST+= .quickly EXTRA_DIST+= README.FIRST EXTRA_DIST+= README.win32 @@ -152,5 +151,7 @@ maintainer-clean-local: -rm -f m4/ltsugar.m4 -rm -f m4/ltversion.m4 -rm -f m4/lt~obsolete.m4 + -rm -f m4/test-driver -rmdir build-aux -rm -rf ${top_builddir}/html + -rm -f bootstrap diff --git a/bootstrap.sh b/bootstrap.sh index c3347d4a..d45c9194 100755 --- a/bootstrap.sh +++ b/bootstrap.sh @@ -38,7 +38,7 @@ # LIBTOOLIZE # MAKE # PREFIX -# TESTS_ENVIRONMENT +# LOG_COMPILER # VERBOSE # WARNINGS # @@ -486,8 +486,8 @@ save_BUILD () die "OLD_MAKE($OLD_MAKE) was set on push, programmer error!" fi - if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then - die "OLD_TESTS_ENVIRONMENT($OLD_TESTS_ENVIRONMENT) was set on push, programmer error!" + if [[ -n "$OLD_LOG_COMPILER" ]]; then + die "OLD_LOG_COMPILER($OLD_LOG_COMPILER) was set on push, programmer error!" fi if [[ -n "$CONFIGURE" ]]; then @@ -502,8 +502,8 @@ save_BUILD () OLD_MAKE=$MAKE fi - if [[ -n "$TESTS_ENVIRONMENT" ]]; then - OLD_TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT + if [[ -n "$LOG_COMPILER" ]]; then + OLD_LOG_COMPILER=$LOG_COMPILER fi } @@ -525,15 +525,15 @@ restore_BUILD () MAKE=$OLD_MAKE fi - if [[ -n "$OLD_TESTS_ENVIRONMENT" ]]; then - TESTS_ENVIRONMENT=$OLD_TESTS_ENVIRONMENT + if [[ -n "$OLD_LOG_COMPILER" ]]; then + LOG_COMPILER=$OLD_LOG_COMPILER fi OLD_CONFIGURE= OLD_CONFIGURE_ARG= OLD_PREFIX= OLD_MAKE= - OLD_TESTS_ENVIRONMENT= + OLD_LOG_COMPILER= export -n CC CXX } @@ -567,9 +567,9 @@ make_valgrind () # If we don't have a configure, then most likely we will be missing libtool assert_file 'configure' if [[ -x 'libtool' ]]; then - TESTS_ENVIRONMENT="./libtool --mode=execute $VALGRIND_COMMAND" + LOG_COMPILER="./libtool --mode=execute $VALGRIND_COMMAND" else - TESTS_ENVIRONMENT="$VALGRIND_COMMAND" + LOG_COMPILER="$VALGRIND_COMMAND" fi make_target 'all' @@ -703,11 +703,11 @@ make_skeleton () else if [[ -n "$DISPLAY" ]]; then if command_exists 'wine'; then - TESTS_ENVIRONMENT='wine' + LOG_COMPILER='wine' fi fi - if [[ -n "$TESTS_ENVIRONMENT" ]]; then + if [[ -n "$LOG_COMPILER" ]]; then make_target 'check' 'warn' || warn "$MAKE check failed" ret=$? fi @@ -935,9 +935,9 @@ make_gdb () # If we don't have a configure, then most likely we will be missing libtool assert_file 'configure' if [[ -f 'libtool' ]]; then - TESTS_ENVIRONMENT="./libtool --mode=execute $GDB_COMMAND" + LOG_COMPILER="./libtool --mode=execute $GDB_COMMAND" else - TESTS_ENVIRONMENT="$GDB_COMMAND" + LOG_COMPILER="$GDB_COMMAND" fi make_target 'check' @@ -974,9 +974,9 @@ make_target () run_configure fi - if [ -n "$TESTS_ENVIRONMENT" ]; then + if [ -n "$LOG_COMPILER" ]; then if $verbose; then - echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT" + echo "LOG_COMPILER=$LOG_COMPILER" fi fi @@ -1386,16 +1386,16 @@ print_setup () echo "MAKE=$MAKE" fi - if [[ -n "$MAKE_TARGET" ]]; then - echo "MAKE_TARGET=$MAKE_TARGET" + if [[ -n "$BOOTSTRAP_TARGET" ]]; then + echo "BOOTSTRAP_TARGET=$BOOTSTRAP_TARGET" fi if [[ -n "$PREFIX" ]]; then echo "PREFIX=$PREFIX" fi - if [[ -n "$TESTS_ENVIRONMENT" ]]; then - echo "TESTS_ENVIRONMENT=$TESTS_ENVIRONMENT" + if [[ -n "$LOG_COMPILER" ]]; then + echo "LOG_COMPILER=$LOG_COMPILER" fi if [[ -n "$VCS_CHECKOUT" ]]; then @@ -1511,7 +1511,7 @@ check_make_target() execute_job () { # We should always have a target by this point - assert MAKE_TARGET + assert BOOTSTRAP_TARGET determine_target_platform @@ -1535,8 +1535,8 @@ execute_job () fi fi - # Use OLD_TESTS_ENVIRONMENT for tracking the state of the variable - local OLD_TESTS_ENVIRONMENT= + # Use OLD_LOG_COMPILER for tracking the state of the variable + local OLD_LOG_COMPILER= # Set ENV PREFIX in order to set --prefix for ./configure if [[ -n "$PREFIX" ]]; then @@ -1547,17 +1547,17 @@ execute_job () make_maintainer_clean fi - local MAKE_TARGET_ARRAY - MAKE_TARGET_ARRAY=( $MAKE_TARGET ) + local BOOTSTRAP_TARGET_ARRAY + BOOTSTRAP_TARGET_ARRAY=( $BOOTSTRAP_TARGET ) - for target in "${MAKE_TARGET_ARRAY[@]}" + for target in "${BOOTSTRAP_TARGET_ARRAY[@]}" do # If we are running inside of Jenkins, we want to only run some of the possible tests if $jenkins_build_environment; then check_make_target $target ret=$? if [ $ret -ne 0 ]; then - die "Unknown MAKE_TARGET option: $target" + die "Unknown BOOTSTRAP_TARGET option: $target" fi fi @@ -1663,7 +1663,7 @@ main () declare -x VCS_CHECKOUT= # Variables we control globally - local -a MAKE_TARGET= + local -a BOOTSTRAP_TARGET= local CONFIGURE= local use_libtool=false local verbose=false @@ -1688,7 +1688,7 @@ main () local OLD_CONFIGURE_ARG= local OLD_PREFIX= local OLD_MAKE= - local OLD_TESTS_ENVIRONMENT= + local OLD_LOG_COMPILER= # If we call autoreconf on the platform or not local AUTORECONF_REBUILD_HOST=false @@ -1726,47 +1726,36 @@ main () local OPT_TARGET= parse_command_line_options "$@" - nassert MAKE_TARGET + nassert BOOTSTRAP_TARGET if [ -n "$OPT_TARGET" ]; then - MAKE_TARGET="$OPT_TARGET" + BOOTSTRAP_TARGET="$OPT_TARGET" fi # If we are running under Jenkins we predetermine what tests we will run against - # This MAKE_TARGET can be overridden by parse_command_line_options based MAKE_TARGET changes. + # This BOOTSTRAP_TARGET can be overridden by parse_command_line_options based BOOTSTRAP_TARGET changes. # We don't want Jenkins overriding other variables, so we NULL them. - if [ -z "$MAKE_TARGET" ]; then + if [ -z "$BOOTSTRAP_TARGET" ]; then if $jenkins_build_environment; then if [[ -n "$JENKINS_TARGET" ]]; then - MAKE_TARGET="$JENKINS_TARGET" - else - if [[ -n "$label" ]]; then - check_make_target $label - if [ $? -eq 0 ]; then - MAKE_TARGET="$label" - fi - fi - - if [[ -n "$LABEL" ]]; then - check_make_target $LABEL - if [ $? -eq 0 ]; then - MAKE_TARGET="$LABEL" - fi - fi - - if [ -z "$MAKE_TARGET" ]; then - MAKE_TARGET='jenkins' + check_make_target $JENKINS_TARGET + if [ $? -eq 0 ]; then + BOOTSTRAP_TARGET="$JENKINS_TARGET" + else + die "label not found: $label" fi + else + BOOTSTRAP_TARGET='jenkins' fi fi fi - if [ -z "$MAKE_TARGET" ]; then - MAKE_TARGET="make_default" + if [ -z "$BOOTSTRAP_TARGET" ]; then + BOOTSTRAP_TARGET="make_default" fi # We should always have a target by this point - assert MAKE_TARGET + assert BOOTSTRAP_TARGET execute_job local ret=$? @@ -1882,7 +1871,7 @@ bootstrap () export LIBTOOLIZE_OPTIONS export MAKE export PREFIX_ARG - export TESTS_ENVIRONMENT + export LOG_COMPILER export VERBOSE export WARNINGS diff --git a/clients/include.am b/clients/include.am index bd38ef04..50c76cc6 100644 --- a/clients/include.am +++ b/clients/include.am @@ -97,10 +97,12 @@ clients_memaslap_LDADD= clients_memaslap_LDADD+= @LIBEVENT_LIB@ clients_memaslap_LDADD+= $(CLIENTS_LDADDS) +clients_memcapable_CXXFLAGS= @PTHREAD_CFLAGS@ clients_memcapable_SOURCES= clients_memcapable_SOURCES+= clients/memcapable.cc clients_memcapable_SOURCES+= libmemcached/byteorder.cc clients_memcapable_LDADD= $(CLIENTS_LDADDS) +clients_memcapable_LDADD+= @PTHREAD_LIBS@ test-start-server: clients/memflush --servers=localhost diff --git a/clients/memcp.cc b/clients/memcp.cc index 6c6d1e96..d76faeec 100644 --- a/clients/memcp.cc +++ b/clients/memcp.cc @@ -68,13 +68,13 @@ static long strtol_wrapper(const char *nptr, int base, bool *error) or (errno != 0 && val == 0)) { *error= true; - return EXIT_SUCCESS; + return 0; } if (endptr == nptr) { *error= true; - return EXIT_SUCCESS; + return 0; } *error= false; @@ -385,10 +385,10 @@ static void options_parse(int argc, char *argv[]) case OPT_EXPIRE: /* --expire */ { bool strtol_error; - opt_expires= (time_t)strtol_wrapper(optarg, 16, &strtol_error); + opt_expires= (time_t)strtol_wrapper(optarg, 10, &strtol_error); if (strtol_error == true) { - fprintf(stderr, "Bad value passed via --flag\n"); + fprintf(stderr, "Bad value passed via --expire\n"); exit(1); } } diff --git a/configure.ac b/configure.ac index 54177ac4..e74ebb7b 100644 --- a/configure.ac +++ b/configure.ac @@ -7,18 +7,22 @@ # the COPYING file in this directory for full text. m4_include([version.m4]) +AC_PREREQ([2.61]) AC_INIT([libmemcached],VERSION_NUMBER,[http://libmemcached.org/]) + +# Setup the compilers early on +AC_PROG_CC([cc gcc clang]) +AC_PROG_CXX([c++ g++ clang++]) + AC_CONFIG_AUX_DIR([build-aux]) AC_CONFIG_MACRO_DIR([m4]) -AC_CANONICAL_TARGET +AC_CANONICAL_HOST AC_ARG_PROGRAM AC_USE_SYSTEM_EXTENSIONS AM_INIT_AUTOMAKE([1.11 color-tests -Wno-portability subdir-objects foreign tar-ustar]) -AC_PREREQ([2.61]) - AC_CONFIG_HEADERS([mem_config.h:mem_config.in])dnl Keep filename to 8.3 for MS-DOS. AC_SUBST([AUTOHEADER_FILE],[mem_config.h]) AC_CONFIG_SRCDIR([libmemcached/memcached.cc]) @@ -47,17 +51,20 @@ AX_HEX_VERSION([LIBHASHKIT],[1.0.0]) m4_include([libhashkit/include.m4]) LT_PREREQ([2.2]) -LT_INIT +LT_INIT([dlopen]) LT_LANG([C++]) LT_LIB_M +AC_SUBST([lt_cv_dlopen_libs]) + + AC_PROG_CC_C99 AS_IF([test "x${ac_cv_prog_cc_c99}" == "xno"],[AC_MSG_ERROR([No c99 compatible compiler found])]) AC_DEFUN([CHECK_CXX0X],[ AC_LANG_PUSH([C++]) AX_CHECK_COMPILE_FLAG([-std=c++0x],[ - CXXFLAGS="$CXXFLAGS -std=c++0x"]) + CXX="$CXX -std=c++0x"]) AC_LANG_POP([C++]) ]) CHECK_CXX0X @@ -65,13 +72,8 @@ CHECK_CXX0X AX_ASSERT AX_PLATFORM - m4_ifdef([AM_SILENT_RULES],[AM_SILENT_RULES([yes])]) -AX_CXX_HEADER_STDCXX_98 -AS_IF([test "x$ax_cv_cxx_stdcxx_98" = "xno"], - [AC_MSG_ERROR([Your system lacks a new enough C++ compiler])]) - AC_DEFUN([LIBMEMCACHED_PROTOCOL], [AC_ARG_ENABLE([libmemcachedprotocol], [AS_HELP_STRING([--enable-libmemcachedprotocol], @@ -254,9 +256,6 @@ AC_CHECK_LIB([rt],[clock_gettime], [AC_DEFINE([HAVE_CLOCK_GETTIME],[0],[Have clock_gettime])]) -# Check for the ability to call dlopen (used in libhostile) -AX_DLOPEN - AC_CHECK_HEADERS([atomic.h]) AS_IF([test "x$ac_cv_header_atomic_h" = "xyes"], [AC_CHECK_FUNCS([atomic_add_64]) @@ -297,8 +296,10 @@ SOCKET_SEND_FLAGS AX_UUID_GENERATE_TIME_SAFE AC_DEFUN([CHECK_FOR_PTHREAD_AND_SASL], - [AX_PTHREAD(, [AC_MSG_ERROR([could not find libpthread])]) + [AC_LANG_PUSH([C++]) + AX_PTHREAD(, [AC_MSG_ERROR([could not find libpthread])]) AX_PTHREAD_TIMEDJOIN_NP + AC_LANG_POP([C++]) # The sasl functions should only be visible if we build with sasl support # diff --git a/libmemcached/behavior.cc b/libmemcached/behavior.cc index 2675e236..081f8082 100644 --- a/libmemcached/behavior.cc +++ b/libmemcached/behavior.cc @@ -230,11 +230,6 @@ memcached_return_t memcached_behavior_set(memcached_st *shell, break; case MEMCACHED_BEHAVIOR_RETRY_TIMEOUT: - if (data == 0) - { - return memcached_set_error(*ptr, MEMCACHED_INVALID_ARGUMENTS, MEMCACHED_AT, - memcached_literal_param("MEMCACHED_BEHAVIOR_RETRY_TIMEOUT requires a value greater then zero.")); - } ptr->retry_timeout= int32_t(data); break; diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc index b60bbd8c..3c82f641 100644 --- a/libmemcached/connect.cc +++ b/libmemcached/connect.cc @@ -198,7 +198,7 @@ static memcached_return_t set_hostinfo(memcached_instance_st* server) struct addrinfo hints; memset(&hints, 0, sizeof(struct addrinfo)); - hints.ai_family= AF_INET; + hints.ai_family= AF_UNSPEC; if (memcached_is_udp(server->root)) { hints.ai_protocol= IPPROTO_UDP; diff --git a/libmemcached/fetch.cc b/libmemcached/fetch.cc index 7f677d02..d7951092 100644 --- a/libmemcached/fetch.cc +++ b/libmemcached/fetch.cc @@ -194,6 +194,7 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, *error= MEMCACHED_MAXIMUM_RETURN; // We use this to see if we ever go into the loop memcached_instance_st *server; memcached_return_t read_ret= MEMCACHED_SUCCESS; + bool connection_failures= false; while ((server= memcached_io_get_readable_server(ptr, read_ret))) { char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; @@ -203,6 +204,11 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, { continue; } + else if (*error == MEMCACHED_CONNECTION_FAILURE) + { + connection_failures= true; + continue; + } else if (*error == MEMCACHED_SUCCESS) { result->count++; @@ -230,6 +236,16 @@ memcached_result_st *memcached_fetch_result(memcached_st *ptr, { *error= MEMCACHED_NOTFOUND; } + else if (connection_failures) + { + /* + If we have a connection failure to some servers, the caller may + wish to treat that differently to getting a definitive NOT_FOUND + from all servers, so return MEMCACHED_CONNECTION_FAILURE to allow + that. + */ + *error= MEMCACHED_CONNECTION_FAILURE; + } else if (*error == MEMCACHED_SUCCESS) { *error= MEMCACHED_END; diff --git a/libmemcached/include.am b/libmemcached/include.am index 0aabc248..1eccc369 100644 --- a/libmemcached/include.am +++ b/libmemcached/include.am @@ -2,7 +2,7 @@ # included from Top Level Makefile.am # All paths should be given relative to the root -libmemcached_libmemcached_la_SOURCES = +libmemcached_libmemcached_la_SOURCES= include libmemcached/csl/include.am @@ -56,8 +56,11 @@ lib_LTLIBRARIES+= libmemcached/libmemcached.la EXTRA_libmemcached_libmemcached_la_DEPENDENCIES= libmemcached_libmemcached_la_LIBADD= libmemcached_libmemcached_la_LDFLAGS= -libmemcached_libmemcached_la_CFLAGS= -DBUILDING_LIBMEMCACHED -libmemcached_libmemcached_la_CXXFLAGS= -DBUILDING_LIBMEMCACHED +libmemcached_libmemcached_la_CFLAGS= +libmemcached_libmemcached_la_CXXFLAGS= + +libmemcached_libmemcached_la_CFLAGS+= -DBUILDING_LIBMEMCACHED +libmemcached_libmemcached_la_CXXFLAGS+= -DBUILDING_LIBMEMCACHED if BUILD_WIN32 libmemcached_libmemcached_la_CFLAGS+= -DBUILDING_HASHKIT @@ -122,12 +125,13 @@ libmemcached_libmemcached_la_SOURCES+= libmemcached/virtual_bucket.c libmemcached/options.cc: libmemcached/csl/parser.h libmemcached_libmemcached_la_LDFLAGS+= -version-info ${MEMCACHED_LIBRARY_VERSION} -libmemcached_libmemcached_la_LIBADD+= @DL_LIB@ +libmemcached_libmemcached_la_LIBADD+= @lt_cv_dlopen_libs@ if HAVE_SASL +libmemcached_libmemcached_la_CFLAGS+= @PTHREAD_CFLAGS@ libmemcached_libmemcached_la_CXXFLAGS+= @PTHREAD_CFLAGS@ libmemcached_libmemcached_la_LIBADD+= @PTHREAD_LIBS@ -libmemcached_libmemcached_la_LIBADD+= @LIBSASL_LIB@ +libmemcached_libmemcached_la_LIBADD+= @SASL_LIB@ endif if HAVE_DTRACE diff --git a/libmemcached/quit.cc b/libmemcached/quit.cc index 7ece03b9..04b77cea 100644 --- a/libmemcached/quit.cc +++ b/libmemcached/quit.cc @@ -120,8 +120,15 @@ void memcached_quit_server(memcached_instance_st* instance, bool io_death) instance->close_socket(); - if (io_death) + if (io_death and memcached_is_udp(instance->root)) { + /* + If using UDP, we should stop using the server briefly on every IO + failure. If using TCP, it may be that the connection went down a + short while ago (e.g. the server failed) and we've only just + noticed, so we should only set the retry timeout on a connect + failure (which doesn't call this method). + */ memcached_mark_server_for_timeout(instance); } } diff --git a/libmemcached/server.hpp b/libmemcached/server.hpp index 0c6ac798..708e6460 100644 --- a/libmemcached/server.hpp +++ b/libmemcached/server.hpp @@ -76,17 +76,20 @@ static inline void memcached_mark_server_for_timeout(memcached_instance_st* serv { if (server->state != MEMCACHED_SERVER_STATE_IN_TIMEOUT) { - struct timeval next_time; - if (gettimeofday(&next_time, NULL) == 0) + if (server->root->retry_timeout != 0) { - server->next_retry= next_time.tv_sec +server->root->retry_timeout; - } - else - { - server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly - } + struct timeval next_time; + if (gettimeofday(&next_time, NULL) == 0) + { + server->next_retry= next_time.tv_sec +server->root->retry_timeout; + } + else + { + server->next_retry= 1; // Setting the value to 1 causes the timeout to occur immediatly + } - server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT; + server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT; + } if (server->server_failure_counter_query_id != server->root->query_id) { server->server_failure_counter++; diff --git a/libmemcached/virtual_bucket.c b/libmemcached/virtual_bucket.c index 92c5dc45..951881bd 100644 --- a/libmemcached/virtual_bucket.c +++ b/libmemcached/virtual_bucket.c @@ -109,14 +109,11 @@ uint32_t memcached_virtual_bucket_get(const memcached_st *self, uint32_t digest) { if (self->virtual_bucket) { - if (self->virtual_bucket) - { - uint32_t result= (uint32_t) (digest & (self->virtual_bucket->size -1)); - return self->virtual_bucket->buckets[result].master; - } - - return (uint32_t) (digest & (self->number_of_hosts -1)); + uint32_t result= (uint32_t) (digest & (self->virtual_bucket->size -1)); + return self->virtual_bucket->buckets[result].master; } + + return (uint32_t) (digest & (self->number_of_hosts -1)); } return 0; diff --git a/libtest/comparison.cc b/libtest/comparison.cc index 9b3e45e5..c0c21937 100644 --- a/libtest/comparison.cc +++ b/libtest/comparison.cc @@ -51,7 +51,7 @@ bool jenkins_is_caller(void) bool gdb_is_caller(void) { - if (bool(getenv("TESTS_ENVIRONMENT")) and strstr(getenv("TESTS_ENVIRONMENT"), "gdb")) + if (bool(getenv("LOG_COMPILER")) and strstr(getenv("LOG_COMPILER"), "gdb")) { return true; } @@ -66,7 +66,7 @@ bool gdb_is_caller(void) bool helgrind_is_caller(void) { - if (bool(getenv("TESTS_ENVIRONMENT")) and strstr(getenv("TESTS_ENVIRONMENT"), "helgrind")) + if (bool(getenv("LOG_COMPILER")) and strstr(getenv("LOG_COMPILER"), "helgrind")) { return true; } diff --git a/libtest/formatter.cc b/libtest/formatter.cc index 01c57609..7cb3ea0a 100644 --- a/libtest/formatter.cc +++ b/libtest/formatter.cc @@ -44,6 +44,56 @@ namespace libtest { +std::string& escape4XML(std::string const& arg, std::string& escaped_string) +{ + escaped_string.clear(); + + escaped_string+= '"'; + for (std::string::const_iterator x= arg.begin(), end= arg.end(); x != end; ++x) + { + unsigned char c= *x; + if (c == '&') + { + escaped_string+= "&"; + } + else if (c == '>') + { + escaped_string+= ">"; + } + else if (c == '<') + { + escaped_string+= "<"; + } + else if (c == '\'') + { + escaped_string+= "'"; break; + } + else if (c == '"') + { + escaped_string+= """; + } + else if (c == ' ') + { + escaped_string+= ' '; + } + else if (isalnum(c)) + { + escaped_string+= c; + } + else + { + char const* const hexdig= "0123456789ABCDEF"; + escaped_string+= "&#x"; + escaped_string+= hexdig[c >> 4]; + escaped_string+= hexdig[c & 0xF]; + escaped_string+= ';'; + } + } + escaped_string+= '"'; + + return escaped_string; +} + class TestCase { public: TestCase(const std::string& arg): @@ -110,7 +160,10 @@ TestCase* Formatter::current() void Formatter::skipped() { current()->result(TEST_SKIPPED); - Out << name() << "." << current()->name() << "\t\t\t\t\t" << "[ " << test_strerror(current()->result()) << " ]"; + Out << name() << "." + << current()->name() + << "\t\t\t\t\t" + << "[ " << test_strerror(current()->result()) << " ]"; reset(); } @@ -120,7 +173,9 @@ void Formatter::failed() assert(current()); current()->result(TEST_FAILURE); - Out << name() << "." << current()->name() << "\t\t\t\t\t" << "[ " << test_strerror(current()->result()) << " ]"; + Out << name() + << "." << current()->name() << "\t\t\t\t\t" + << "[ " << test_strerror(current()->result()) << " ]"; reset(); } @@ -129,6 +184,7 @@ void Formatter::success(const libtest::Timer& timer_) { assert(current()); current()->result(TEST_SUCCESS, timer_); + std::string escaped_string; Out << name() << "." << current()->name() @@ -141,38 +197,50 @@ void Formatter::success(const libtest::Timer& timer_) void Formatter::xml(libtest::Framework& framework_, std::ofstream& output) { - output << "" << std::endl; + std::string escaped_string; + + output << "" << std::endl; + for (Suites::iterator framework_iter= framework_.suites().begin(); framework_iter != framework_.suites().end(); ++framework_iter) { - output << "\tname() << "\" classname=\"\" package=\"\">" << std::endl; + output << "\t" << std::endl; for (TestCases::iterator case_iter= (*framework_iter)->formatter()->testcases().begin(); case_iter != (*framework_iter)->formatter()->testcases().end(); ++case_iter) { - output << "\t\tname() - << "\" time=\"" + output << "\t\ttimer().elapsed_milliseconds() - << "\">" - << std::endl; + << "\""; switch ((*case_iter)->result()) { case TEST_SKIPPED: + output << ">" << std::endl; output << "\t\t " << std::endl; + output << "\t\t" << std::endl; break; case TEST_FAILURE: + output << ">" << std::endl; output << "\t\t "<< std::endl; + output << "\t\t" << std::endl; break; case TEST_SUCCESS: + output << "/>" << std::endl; break; } - output << "\t\t" << std::endl; } output << "\t" << std::endl; } diff --git a/libtest/include.am b/libtest/include.am index 4d1d8428..0e5efc7a 100644 --- a/libtest/include.am +++ b/libtest/include.am @@ -7,7 +7,7 @@ LIBTOOL_COMMAND= ${abs_top_builddir}/libtool --mode=execute VALGRIND_EXEC_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=memcheck --error-exitcode=1 --leak-check=yes --track-fds=yes --malloc-fill=A5 --free-fill=DE SGCHECK_EXEC_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=exp-sgcheck --error-exitcode=1 -VALGRIND_COMMAND= TESTS_ENVIRONMENT="valgrind" $(VALGRIND_EXEC_COMMAND) +VALGRIND_COMMAND= LOG_COMPILER="valgrind" $(VALGRIND_EXEC_COMMAND) HELGRIND_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=helgrind --read-var-info=yes --error-exitcode=1 --read-var-info=yes DRD_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=drd --free-is-write=yes --error-exitcode=1 SGCHECK_COMMAND= $(LIBTOOL_COMMAND) valgrind --tool=exp-sgcheck --error-exitcode=1 @@ -25,22 +25,22 @@ export SGCHECK_COMMAND export GDB_COMMAND valgrind: - @echo make check TESTS_ENVIRONMENT="\"$(VALGRIND_EXEC_COMMAND)\"" + @echo make check LOG_COMPILER="\"$(VALGRIND_EXEC_COMMAND)\"" sgcheck: - @echo make check TESTS_ENVIRONMENT="\"$(SGCHECK_EXEC_COMMAND)\"" + @echo make check LOG_COMPILER="\"$(SGCHECK_EXEC_COMMAND)\"" valgrind-supressions: - @echo make check TESTS_ENVIRONMENT="\"$(VALGRIND_SUPRESSION)\"" + @echo make check LOG_COMPILER="\"$(VALGRIND_SUPRESSION)\"" gdb: - @echo make check TESTS_ENVIRONMENT="\"$(GDB_COMMAND)\"" + @echo make check LOG_COMPILER="\"$(GDB_COMMAND)\"" helgrind: - @echo make check TESTS_ENVIRONMENT="\"$(HELGRIND_COMMAND)\"" + @echo make check LOG_COMPILER="\"$(HELGRIND_COMMAND)\"" drd: - @echo make check TESTS_ENVIRONMENT="\"$(DRD_COMMAND)\"" + @echo make check LOG_COMPILER="\"$(DRD_COMMAND)\"" EXTRA_DIST+= libtest/run.gdb EXTRA_DIST+= libtest/version.h @@ -170,8 +170,10 @@ libtest_libtest_la_LDFLAGS= # We are either building in tree, or with libtest_libtest_la_SOURCES+= libtest/memcached.cc +if HAVE_LIBDRIZZLE libtest_libtest_la_LDFLAGS+= @LIBDRIZZLE_LDFLAGS@ libtest_libtest_la_LIBADD+= @LIBDRIZZLE_LIB@ +endif libtest_libtest_la_SOURCES+= libtest/gearmand.cc @@ -244,7 +246,7 @@ libtest_backtrace_SOURCES= libtest_backtrace_LDADD= libtest_backtrace_SOURCES+= libtest/backtrace_test.cc libtest_backtrace_SOURCES+= libmemcached/backtrace.cc -libtest_backtrace_LDADD+= @DL_LIB@ +libtest_backtrace_LDADD+= @lt_cv_dlopen_libs@ noinst_PROGRAMS+= libtest/backtrace test-backtrace: libtest/backtrace @libtest/backtrace diff --git a/libtest/unittest.cc b/libtest/unittest.cc index c2143889..a2843d27 100644 --- a/libtest/unittest.cc +++ b/libtest/unittest.cc @@ -540,7 +540,7 @@ static test_return_t memcached_sasl_test(void *object) server_startup_st *servers= (server_startup_st*)object; test_true(servers); - test_skip(false, bool(getenv("TESTS_ENVIRONMENT"))); + test_skip(false, bool(getenv("LOG_COMPILER"))); if (MEMCACHED_SASL_BINARY) { diff --git a/libtest/valgrind.h b/libtest/valgrind.h index 9d9e8bac..effeddc1 100644 --- a/libtest/valgrind.h +++ b/libtest/valgrind.h @@ -38,14 +38,14 @@ static inline bool valgrind_is_caller(void) { - if (getenv("TESTS_ENVIRONMENT") && strstr(getenv("TESTS_ENVIRONMENT"), "valgrind")) + if (getenv("LOG_COMPILER") && strstr(getenv("LOG_COMPILER"), "valgrind")) { - if (strstr(getenv("TESTS_ENVIRONMENT"), "--tool") == NULL) + if (strstr(getenv("LOG_COMPILER"), "--tool") == NULL) { return true; } - if (strstr(getenv("TESTS_ENVIRONMENT"), "--tool=memcheck")) + if (strstr(getenv("LOG_COMPILER"), "--tool=memcheck")) { return true; } diff --git a/m4/ax_check_library.m4 b/m4/ax_check_library.m4 index dd27ff41..35ab7114 100644 --- a/m4/ax_check_library.m4 +++ b/m4/ax_check_library.m4 @@ -87,9 +87,6 @@ AC_DEFUN([AX_CHECK_LIBRARY], AS_IF([test "$]AS_TR_SH([ax_cv_have_]$1)[" = "yes"], [AC_DEFINE([HAVE_]$1, [1], [Define to 1 if ]$1[ is found]) - AC_SUBST($1[_CPPFLAGS]) - AC_SUBST($1[_LDFLAGS]) - AC_SUBST($1[_LIB],[-l]$3) ifelse([$4], , :, [$4])], [ifelse([$5], , :, [$5])]) ]) diff --git a/m4/ax_compiler_vendor.m4 b/m4/ax_compiler_vendor.m4 index 13bf7dba..c2f421bc 100644 --- a/m4/ax_compiler_vendor.m4 +++ b/m4/ax_compiler_vendor.m4 @@ -4,7 +4,7 @@ # # SYNOPSIS # -# AX_COMPILER_VENDOR() +# AX_COMPILER_VENDOR # # DESCRIPTION # @@ -44,7 +44,7 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 11 +#serial 12 AC_DEFUN([AX_COMPILER_VENDOR], [AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, @@ -53,6 +53,7 @@ AC_DEFUN([AX_COMPILER_VENDOR], ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ pathscale: __PATHCC__,__PATHSCALE__ clang: __clang__ + fujitsu: __FUJITSU gnu: __GNUC__ sun: __SUNPRO_C,__SUNPRO_CC hp: __HP_cc,__HP_aCC diff --git a/m4/ax_dlopen.m4 b/m4/ax_dlopen.m4 deleted file mode 100644 index 514c578a..00000000 --- a/m4/ax_dlopen.m4 +++ /dev/null @@ -1,10 +0,0 @@ -#serial 2 - -AC_DEFUN([AX_DLOPEN], - [AS_IF([test "x$enable_shared" = xyes], - [AX_CHECK_LIBRARY([DL],[dlfcn.h],[dl], - [AC_DEFINE([HAVE_LIBDL],[1],[Have dlopen]) - AC_CHECK_LIB([dl],[dlopen],[AC_DEFINE([HAVE_DLOPEN],[1],[Have dlopen])]) - AC_CHECK_LIB([dl],[dladdr],[AC_DEFINE([HAVE_DLADDR],[1],[Have dladdr])])])]) - ]) - diff --git a/m4/ax_harden_compiler_flags.m4 b/m4/ax_harden_compiler_flags.m4 index 2be988a3..5d5bfdc1 100644 --- a/m4/ax_harden_compiler_flags.m4 +++ b/m4/ax_harden_compiler_flags.m4 @@ -212,7 +212,6 @@ AC_DEFUN([_HARDEN_CC_COMPILER_FLAGS], _APPEND_COMPILE_FLAGS_ERROR([-Wunused-parameter]) _APPEND_COMPILE_FLAGS_ERROR([-Wunused-local-typedefs]) _APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings]) - _APPEND_COMPILE_FLAGS_ERROR([-floop-parallelize-all]) _APPEND_COMPILE_FLAGS_ERROR([-fwrapv]) _APPEND_COMPILE_FLAGS_ERROR([-fmudflapt]) _APPEND_COMPILE_FLAGS_ERROR([-pipe]) @@ -318,7 +317,6 @@ AC_DEFUN([_HARDEN_CXX_COMPILER_FLAGS], _APPEND_COMPILE_FLAGS_ERROR([-Wunused-local-typedefs]) _APPEND_COMPILE_FLAGS_ERROR([-Wwrite-strings]) _APPEND_COMPILE_FLAGS_ERROR([-Wformat-security]) - _APPEND_COMPILE_FLAGS_ERROR([-floop-parallelize-all]) _APPEND_COMPILE_FLAGS_ERROR([-fwrapv]) _APPEND_COMPILE_FLAGS_ERROR([-fmudflapt]) _APPEND_COMPILE_FLAGS_ERROR([-pipe]) diff --git a/m4/ax_pthread.m4 b/m4/ax_pthread.m4 index ebea7fb5..18055791 100644 --- a/m4/ax_pthread.m4 +++ b/m4/ax_pthread.m4 @@ -82,7 +82,7 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 22 +#serial 23 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ diff --git a/m4/ax_restore_flags.m4 b/m4/ax_restore_flags.m4 index cf03cae7..aafd3638 100644 --- a/m4/ax_restore_flags.m4 +++ b/m4/ax_restore_flags.m4 @@ -4,28 +4,49 @@ # # SYNOPSIS # -# AX_RESTORE_FLAGS() +# AX_RESTORE_FLAGS([namespace]) # # DESCRIPTION # -# Restore common compilation flags from temporary variables +# Restore common compilation flags from temporary variables. +# +# Compilation flags includes: CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS, LIBS, +# OBJCFLAGS. +# +# By default these flags are restored to a global (empty) namespace, but +# user could restore from specific NAMESPACE by using +# AX_RESTORE_FLAGS(NAMESPACE) macro. +# +# Typical usage is like: +# +# AX_SAVE_FLAGS(mypackage) +# CPPFLAGS="-Imypackagespath ${CPPFLAGS}" +# dnl ... do some detection ... +# AX_RESTORE_FLAGS(mypackage) # # LICENSE # # Copyright (c) 2009 Filippo Giunchedi +# Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2011 Russ Allbery +# Copyright (c) 2013 Bastien ROUCARIES # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 3 +#serial 6 + +# save one flag in name space +AC_DEFUN([_AX_RESTORE_ONE_FLAG],[dnl + AS_VAR_PUSHDEF([_ax_restore_flag_var], [$2[]_$1[]_ax_save_flags]) + AS_VAR_COPY($2[],_ax_restore_flag_var) + AS_VAR_POPDEF([_ax_restore_flag_var]) +]) -AC_DEFUN([AX_RESTORE_FLAGS], [ - CPPFLAGS="${CPPFLAGS_save}" - CFLAGS="${CFLAGS_save}" - CXXFLAGS="${CXXFLAGS_save}" - OBJCFLAGS="${OBJCFLAGS_save}" - LDFLAGS="${LDFLAGS_save}" - LIBS="${LIBS_save}" +AC_DEFUN([AX_RESTORE_FLAGS], [dnl + m4_foreach([FLAG], dnl + [_AX_SAVE_FLAGS_LIST()], dnl + [_AX_RESTORE_ONE_FLAG([$1],FLAG)]) ]) diff --git a/m4/ax_sasl.m4 b/m4/ax_sasl.m4 index aa0bd1b7..44bb65e3 100644 --- a/m4/ax_sasl.m4 +++ b/m4/ax_sasl.m4 @@ -20,33 +20,32 @@ # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 2 +#serial 3 AC_DEFUN([AX_SASL_OPTION], - [AC_REQUIRE([AX_SASL_CHECK]) - AC_ARG_ENABLE([sasl], - [AS_HELP_STRING([--disable-sasl], [Build with sasl support @<:@default=on@:>@])], - [ac_enable_sasl="$enableval"], - [ac_enable_sasl=yes]) + [AC_REQUIRE([AX_SASL_CHECK]) + AC_ARG_ENABLE([sasl], + [AS_HELP_STRING([--disable-sasl], [Build with sasl support @<:@default=on@:>@])], + [ac_enable_sasl="$enableval"], + [ac_enable_sasl=yes]) - AS_IF([test "x${ac_enable_sasl}" = xyes], - [AC_MSG_CHECKING([checking to see if enabling sasl]) - AS_IF([test "x${ax_sasl_check}" = xyes], - [ax_sasl_option=yes], - [AC_MSG_WARN([request to add sasl support failed, please see config.log]) - ac_enable_sasl=no - ax_sasl_option=no]) - AC_MSG_RESULT(["$ax_sasl_option"]) - ]) - AM_CONDITIONAL([HAVE_SASL],[test "x${ax_sasl_option}" = xyes]) - ]) + AS_IF([test "x${ac_enable_sasl}" = xyes],[ + AC_MSG_CHECKING([checking to see if enabling sasl]) + AS_IF([test "x${ax_sasl_check}" = xyes],[ + ax_sasl_option=yes],[ + AC_MSG_WARN([request to add sasl support failed, please see config.log]) + ac_enable_sasl=no + ax_sasl_option=no]) + AC_MSG_RESULT(["$ax_sasl_option"])],[ + ax_sasl_option=no]) + AM_CONDITIONAL([HAVE_SASL],[test "x${ax_sasl_option}" = xyes]) + ]) -AC_DEFUN([AX_SASL_CHECK], - [ax_sasl_check=no - AX_CHECK_LIBRARY([LIBSASL],[sasl/sasl.h],[sasl2], - [ax_sasl_check=yes - AC_SUBST([SASL_LIB],[[-lsasl2]]) - ]) - AC_MSG_CHECKING([checking to see if sasl works]) - AC_MSG_RESULT(["$ax_sasl_check"]) - ]) +AC_DEFUN([AX_SASL_CHECK],[ + AX_CHECK_LIBRARY([LIBSASL],[sasl/sasl.h],[sasl2],[ + ax_sasl_check=yes + AC_SUBST([SASL_LIB],[[-lsasl2]])],[ + ax_sasl_check=no]) + AC_MSG_CHECKING([checking to see if sasl works]) + AC_MSG_RESULT(["$ax_sasl_check"]) + ]) diff --git a/m4/ax_save_flags.m4 b/m4/ax_save_flags.m4 index d2a05422..39f45be4 100644 --- a/m4/ax_save_flags.m4 +++ b/m4/ax_save_flags.m4 @@ -4,28 +4,68 @@ # # SYNOPSIS # -# AX_SAVE_FLAGS() +# AX_SAVE_FLAGS([NAMESPACE]) # # DESCRIPTION # -# Save common compilation flags into temporary variables +# Save common compilation flags into temporary variables. +# +# Compilation flags includes: CPPFLAGS, CFLAGS, CXXFLAGS, LDFLAGS, LIBS, +# OBJCFLAGS. +# +# By default these flags are saved to a global (empty) namespace, but user +# could specify a specific NAMESPACE to AX_SAVE_FLAGS macro and latter +# restore it by using AX_RESTORE_FLAGS(NAMESPACE). +# +# AX_SAVE_FLAGS(mypackage) +# CPPFLAGS="-Imypackagespath ${CPPFLAGS}" +# dnl .. do some detection ... +# AX_RESTORE_FLAGS(mypackage) # # LICENSE # # Copyright (c) 2009 Filippo Giunchedi +# Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2011 Russ Allbery +# Copyright (c) 2013 Bastien ROUCARIES # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice # and this notice are preserved. This file is offered as-is, without any # warranty. -#serial 3 +#serial 7 + +# list of flag to save +AC_DEFUN([_AX_SAVE_FLAGS_LIST],[dnl +[CCASFLAGS],dnl +[CFLAGS],dnl +[CPPFLAGS],dnl +[CXXFLAGS],dnl +[ERLCFLAGS],dnl +[FCFLAGS],dnl +[FCLIBS],dnl +[FFLAGS],dnl +[FLIBS],dnl +[GCJFLAGS],dnl +[JAVACFLAGS],dnl +[LDFLAGS],dnl +[LIBS],dnl +[OBJCFLAGS],dnl +[OBJCXXFLAGS],dnl +[UPCFLAGS],dnl +[VALAFLAGS]dnl +]) + +# save one flag in name space +AC_DEFUN([_AX_SAVE_ONE_FLAG],[ + AS_VAR_PUSHDEF([_ax_save_flag_var], [$2[]_$1[]_ax_save_flags]) + AS_VAR_COPY(_ax_save_flag_var, $2[]) + AS_VAR_POPDEF([_ax_save_flag_var]) +]) -AC_DEFUN([AX_SAVE_FLAGS], [ - CPPFLAGS_save="${CPPFLAGS}" - CFLAGS_save="${CFLAGS}" - CXXFLAGS_save="${CXXFLAGS}" - OBJCFLAGS_save="${OBJCFLAGS}" - LDFLAGS_save="${LDFLAGS}" - LIBS_save="${LIBS}" +AC_DEFUN([AX_SAVE_FLAGS],[dnl + m4_foreach([FLAG], dnl + [_AX_SAVE_FLAGS_LIST()], dnl + [_AX_SAVE_ONE_FLAG([$1],FLAG)]) ]) diff --git a/tests/include.am b/tests/include.am index 414b143b..49d45dd4 100644 --- a/tests/include.am +++ b/tests/include.am @@ -27,10 +27,10 @@ noinst_HEADERS+= tests/runner.h # Cycle should always run first tests_cycle_CFLAGS= $(AM_CFLAGS) $(NO_CONVERSION) $(NO_STRICT_ALIASING) tests_cycle_CXXFLAGS= $(AM_CXXFLAGS) -tests_cycle_CXXFLAGS+= ${PTHREAD_CFLAGS} +tests_cycle_CXXFLAGS+= @PTHREAD_CFLAGS@ tests_cycle_SOURCES= tests/cycle.cc tests_cycle_LDADD= $(TESTS_LDADDS) -tests_cycle_LDADD+= ${PTHREAD_LIBS} +tests_cycle_LDADD+= @PTHREAD_LIBS@ check_PROGRAMS+= tests/cycle noinst_PROGRAMS+= tests/cycle diff --git a/tests/libmemcached-1.0/all_tests.h b/tests/libmemcached-1.0/all_tests.h index d748d39e..b4abe9dd 100644 --- a/tests/libmemcached-1.0/all_tests.h +++ b/tests/libmemcached-1.0/all_tests.h @@ -284,6 +284,7 @@ test_st regression_tests[]= { {"lp:1021819", true, (test_callback_fn*)regression_1021819_TEST }, {"lp:1048945", true, (test_callback_fn*)regression_1048945_TEST }, {"lp:1067242", true, (test_callback_fn*)regression_1067242_TEST }, + {"lp:1251482", true, (test_callback_fn*)regression_bug_1251482 }, {0, false, (test_callback_fn*)0} }; diff --git a/tests/libmemcached-1.0/mem_functions.cc b/tests/libmemcached-1.0/mem_functions.cc index e69e0e12..365839d5 100644 --- a/tests/libmemcached-1.0/mem_functions.cc +++ b/tests/libmemcached-1.0/mem_functions.cc @@ -4559,7 +4559,7 @@ test_return_t wrong_failure_counter_two_test(memcached_st *memc) /* Put a retry timeout to effectively activate failure_limit effect */ test_compare(MEMCACHED_SUCCESS, - memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, true)); + memcached_behavior_set(memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 1)); /* change behavior that triggers memcached_quit()*/ test_compare(MEMCACHED_SUCCESS, @@ -4841,6 +4841,28 @@ test_return_t regression_bug_490520(memcached_st *original_memc) return TEST_SUCCESS; } +test_return_t regression_bug_1251482(memcached_st*) +{ + test::Memc memc("--server=localhost:5"); + + memcached_behavior_set(&memc, MEMCACHED_BEHAVIOR_RETRY_TIMEOUT, 0); + + for (size_t x= 4; x; --x) + { + size_t value_length; + memcached_return_t rc; + char *value= memcached_get(&memc, + test_literal_param(__func__), + &value_length, NULL, &rc); + + test_false(value); + test_compare(0LLU, value_length); + test_compare(MEMCACHED_CONNECTION_FAILURE, rc); + } + + return TEST_SUCCESS; +} + test_return_t regression_1009493_TEST(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 75736931..41aea118 100644 --- a/tests/libmemcached-1.0/mem_functions.h +++ b/tests/libmemcached-1.0/mem_functions.h @@ -187,3 +187,4 @@ test_return_t regression_1009493_TEST(memcached_st*); test_return_t regression_1048945_TEST(memcached_st*); test_return_t regression_1067242_TEST(memcached_st*); test_return_t comparison_operator_memcached_st_and__memcached_return_t_TEST(memcached_st*); +test_return_t regression_bug_1251482(memcached_st*); diff --git a/tests/libmemcached_world.h b/tests/libmemcached_world.h index 4d4953ee..2608778c 100644 --- a/tests/libmemcached_world.h +++ b/tests/libmemcached_world.h @@ -50,7 +50,7 @@ static void *world_create(libtest::server_startup_st& servers, test_return_t& er SKIP_UNLESS(libtest::has_libmemcached_sasl()); // Assume we are running under valgrind, and bail - if (getenv("TESTS_ENVIRONMENT")) + if (getenv("LOG_COMPILER")) { error= TEST_SKIPPED; return NULL; diff --git a/tests/mem_udp.cc b/tests/mem_udp.cc index 2267fac0..53584146 100644 --- a/tests/mem_udp.cc +++ b/tests/mem_udp.cc @@ -145,7 +145,7 @@ static test_return_t init_udp(memcached_st *memc) static test_return_t init_udp_valgrind(memcached_st *memc) { - if (getenv("TESTS_ENVIRONMENT")) + if (getenv("LOG_COMPILER")) { return TEST_SKIPPED; } @@ -157,7 +157,7 @@ static test_return_t init_udp_valgrind(memcached_st *memc) static test_return_t binary_init_udp(memcached_st *memc) { - if (getenv("TESTS_ENVIRONMENT")) + if (getenv("LOG_COMPILER")) { return TEST_SKIPPED; } @@ -269,7 +269,7 @@ static test_return_t set_udp_behavior_test(memcached_st *memc) static test_return_t udp_set_test(memcached_st *memc) { // Assume we are running under valgrind, and bail - if (getenv("TESTS_ENVIRONMENT")) + if (getenv("LOG_COMPILER")) { return TEST_SUCCESS; }