diff options
author | Continuous Integration <ci@tangent.org> | 2014-02-06 01:21:14 -0800 |
---|---|---|
committer | Continuous Integration <ci@tangent.org> | 2014-02-06 01:21:14 -0800 |
commit | d87b5f2ec450afd521e7ebf556c3a9cddbc22e99 (patch) | |
tree | 4bf6c6056350f05006f6f1fe6fe609ab05eb0e55 | |
parent | cccbbaead99e3ad6a6ec975e046c62d9fb227e07 (diff) | |
parent | 2a78a93f72ee23b3dbc3b7399610e1ba16430bec (diff) | |
download | libmemcached-d87b5f2ec450afd521e7ebf556c3a9cddbc22e99.tar.gz |
Merge bzr://10.0.3.21/ Build: jenkins-Libmemcached-454
44 files changed, 449 insertions, 209 deletions
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 @@ -2,7 +2,7 @@ * Enable MEMCACHED_BEHAVIOR_VERIFY_KEY by default 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 62b88708..b7c99a5e 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 @@ -137,5 +136,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 22513a7b..70956e3a 100644 --- a/clients/include.am +++ b/clients/include.am @@ -102,10 +102,12 @@ clients_memaslap_LDADD+= @LIBEVENT_LIB@ clients_memaslap_LDADD+= $(CLIENTS_LDADDS) clients_memaslap_LDADD+= @PTHREAD_LIBS@ +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 27aa2f81..9c50ecb2 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 ddca4f15..f8d0ff97 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], @@ -255,9 +257,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]) @@ -298,8 +297,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-1.2/defaults.h b/libmemcached-1.2/defaults.h index 177e18cf..d440f8c8 100644 --- a/libmemcached-1.2/defaults.h +++ b/libmemcached-1.2/defaults.h @@ -52,5 +52,5 @@ #define MEMCACHED_SERVER_FAILURE_LIMIT 5 #define MEMCACHED_SERVER_FAILURE_RETRY_TIMEOUT 2 #define MEMCACHED_SERVER_FAILURE_DEAD_TIMEOUT 0 - +#define MEMCACHED_SERVER_TIMEOUT_LIMIT 0 diff --git a/libmemcached-1.2/server.h b/libmemcached-1.2/server.h index 1999de0a..ba705b7b 100644 --- a/libmemcached-1.2/server.h +++ b/libmemcached-1.2/server.h @@ -104,6 +104,9 @@ LIBMEMCACHED_API in_port_t memcached_server_port(const memcached_instance_st * self); LIBMEMCACHED_API +in_port_t memcached_server_srcport(const memcached_instance_st * self); + +LIBMEMCACHED_API void memcached_instance_next_retry(const memcached_instance_st * self, const time_t absolute_time); LIBMEMCACHED_API diff --git a/libmemcached-1.2/struct/memcached.h b/libmemcached-1.2/struct/memcached.h index 37df2751..a368bfe8 100644 --- a/libmemcached-1.2/struct/memcached.h +++ b/libmemcached-1.2/struct/memcached.h @@ -79,6 +79,7 @@ struct memcached_st { int32_t snd_timeout; int32_t rcv_timeout; uint32_t server_failure_limit; + uint32_t server_timeout_limit; uint32_t io_msg_watermark; uint32_t io_bytes_watermark; uint32_t io_key_prefetch; diff --git a/libmemcached-1.2/struct/server.h b/libmemcached-1.2/struct/server.h index 33bdc049..9337938d 100644 --- a/libmemcached-1.2/struct/server.h +++ b/libmemcached-1.2/struct/server.h @@ -77,6 +77,8 @@ struct memcached_server_st { uint32_t request_id; uint32_t server_failure_counter; uint64_t server_failure_counter_query_id; + uint32_t server_timeout_counter; + uint64_t server_timeout_counter_query_id; uint32_t weight; uint32_t version; enum memcached_server_state_t state; diff --git a/libmemcached-1.2/types/behavior.h b/libmemcached-1.2/types/behavior.h index d0af189a..a1bbfd22 100644 --- a/libmemcached-1.2/types/behavior.h +++ b/libmemcached-1.2/types/behavior.h @@ -76,6 +76,7 @@ enum memcached_behavior_t { MEMCACHED_BEHAVIOR_LOAD_FROM_FILE, MEMCACHED_BEHAVIOR_REMOVE_FAILED_SERVERS, MEMCACHED_BEHAVIOR_DEAD_TIMEOUT, + MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT, MEMCACHED_BEHAVIOR_MAX }; diff --git a/libmemcached/behavior.cc b/libmemcached/behavior.cc index 2675e236..b45e8468 100644 --- a/libmemcached/behavior.cc +++ b/libmemcached/behavior.cc @@ -116,6 +116,10 @@ memcached_return_t memcached_behavior_set(memcached_st *shell, ptr->server_failure_limit= uint32_t(data); break; + case MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT: + ptr->server_timeout_limit= uint32_t(data); + break; + case MEMCACHED_BEHAVIOR_BINARY_PROTOCOL: send_quit(ptr); // We need t shutdown all of the connections to make sure we do the correct protocol if (data) @@ -230,11 +234,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; @@ -379,6 +378,9 @@ uint64_t memcached_behavior_get(memcached_st *shell, case MEMCACHED_BEHAVIOR_SERVER_FAILURE_LIMIT: return ptr->server_failure_limit; + case MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT: + return ptr->server_timeout_limit; + case MEMCACHED_BEHAVIOR_SORT_HOSTS: return ptr->flags.use_sort_hosts; @@ -628,6 +630,7 @@ const char *libmemcached_string_behavior(const memcached_behavior_t flag) { switch (flag) { + case MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT: return "MEMCACHED_BEHAVIOR_SERVER_TIMEOUT_LIMIT"; case MEMCACHED_BEHAVIOR_NO_BLOCK: return "MEMCACHED_BEHAVIOR_NO_BLOCK"; case MEMCACHED_BEHAVIOR_TCP_NODELAY: return "MEMCACHED_BEHAVIOR_TCP_NODELAY"; case MEMCACHED_BEHAVIOR_HASH: return "MEMCACHED_BEHAVIOR_HASH"; diff --git a/libmemcached/connect.cc b/libmemcached/connect.cc index 176fa153..9a96e2e9 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; @@ -715,6 +715,7 @@ static memcached_return_t backoff_handling(memcached_instance_st* server, bool& if (_gettime_success and server->next_retry < curr_time.tv_sec) { server->state= MEMCACHED_SERVER_STATE_NEW; + server->server_timeout_counter= 0; } else { diff --git a/libmemcached/fetch.cc b/libmemcached/fetch.cc index f6fefe66..c7512ffb 100644 --- a/libmemcached/fetch.cc +++ b/libmemcached/fetch.cc @@ -194,6 +194,7 @@ memcached_result_st *memcached_fetch_result(memcached_st *memc, *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(memc, read_ret))) { char buffer[MEMCACHED_DEFAULT_COMMAND_SIZE]; @@ -203,6 +204,11 @@ memcached_result_st *memcached_fetch_result(memcached_st *memc, { continue; } + else if (*error == MEMCACHED_CONNECTION_FAILURE) + { + connection_failures= true; + continue; + } else if (*error == MEMCACHED_SUCCESS) { result->impl()->count++; @@ -230,6 +236,16 @@ memcached_result_st *memcached_fetch_result(memcached_st *memc, { *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 493a89b5..2e201925 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 @@ -53,8 +53,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 @@ -120,9 +123,10 @@ 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+= @SASL_LIB@ diff --git a/libmemcached/instance.cc b/libmemcached/instance.cc index 82621f7a..53f74f79 100644 --- a/libmemcached/instance.cc +++ b/libmemcached/instance.cc @@ -54,6 +54,8 @@ static inline void _server_init(memcached_instance_st* self, Memcached *root, self->request_id= 0; self->server_failure_counter= 0; self->server_failure_counter_query_id= 0; + self->server_timeout_counter= 0; + self->server_timeout_counter_query_id= 0; self->weight= weight ? weight : 1; // 1 is the default weight value self->io_wait_count.read= 0; self->io_wait_count.write= 0; diff --git a/libmemcached/instance.hpp b/libmemcached/instance.hpp index c76dc7ee..73d74a66 100644 --- a/libmemcached/instance.hpp +++ b/libmemcached/instance.hpp @@ -73,6 +73,7 @@ struct memcached_instance_st { void mark_server_as_clean() { server_failure_counter= 0; + server_timeout_counter= 0; next_retry= 0; } @@ -147,6 +148,8 @@ struct memcached_instance_st { uint32_t request_id; uint32_t server_failure_counter; uint64_t server_failure_counter_query_id; + uint32_t server_timeout_counter; + uint32_t server_timeout_counter_query_id; uint32_t weight; uint32_t version; enum memcached_server_state_t state; diff --git a/libmemcached/io.cc b/libmemcached/io.cc index 8796d503..e9d3ad39 100644 --- a/libmemcached/io.cc +++ b/libmemcached/io.cc @@ -342,6 +342,7 @@ static bool io_flush(memcached_instance_st* instance, } ssize_t sent_length= ::send(instance->fd, local_write_ptr, write_length, flags); + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno if (sent_length == SOCKET_ERROR) { @@ -381,14 +382,14 @@ static bool io_flush(memcached_instance_st* instance, } memcached_quit_server(instance, true); - error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT); return false; } case ENOTCONN: case EPIPE: default: memcached_quit_server(instance, true); - error= memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + error= memcached_set_errno(*instance, local_errno, MEMCACHED_AT); WATCHPOINT_ASSERT(instance->fd == INVALID_SOCKET); return false; } @@ -422,6 +423,8 @@ static memcached_return_t _io_fill(memcached_instance_st* instance) do { data_read= ::recv(instance->fd, instance->read_buffer, MEMCACHED_MAX_BUFFER, MSG_NOSIGNAL); + int local_errno= get_socket_errno(); // We cache in case memcached_quit_server() modifies errno + if (data_read == SOCKET_ERROR) { switch (get_socket_errno()) @@ -460,7 +463,7 @@ static memcached_return_t _io_fill(memcached_instance_st* instance) case ECONNREFUSED: default: memcached_quit_server(instance, true); - memcached_set_errno(*instance, get_socket_errno(), MEMCACHED_AT); + memcached_set_errno(*instance, local_errno, MEMCACHED_AT); break; } diff --git a/libmemcached/memcached.cc b/libmemcached/memcached.cc index 2bd81e06..4a3ad89a 100644 --- a/libmemcached/memcached.cc +++ b/libmemcached/memcached.cc @@ -87,6 +87,7 @@ static inline bool _memcached_init(Memcached *self) self->snd_timeout= 0; self->rcv_timeout= 0; self->server_failure_limit= MEMCACHED_SERVER_FAILURE_LIMIT; + self->server_timeout_limit= MEMCACHED_SERVER_TIMEOUT_LIMIT; self->query_id= 1; // 0 is considered invalid /* TODO, Document why we picked these defaults */ @@ -362,6 +363,7 @@ memcached_st *memcached_clone(memcached_st *clone, const memcached_st *source) new_clone->get_key_failure= source->get_key_failure; new_clone->delete_trigger= source->delete_trigger; new_clone->server_failure_limit= source->server_failure_limit; + new_clone->server_timeout_limit= source->server_timeout_limit; new_clone->io_msg_watermark= source->io_msg_watermark; new_clone->io_bytes_watermark= source->io_bytes_watermark; new_clone->io_key_prefetch= source->io_key_prefetch; diff --git a/libmemcached/quit.cc b/libmemcached/quit.cc index 7ece03b9..5d17b313 100644 --- a/libmemcached/quit.cc +++ b/libmemcached/quit.cc @@ -93,6 +93,7 @@ namespace { * sent to the server. */ instance->server_failure_counter= 0; + instance->server_timeout_counter= 0; } } @@ -120,8 +121,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.cc b/libmemcached/server.cc index b38120ad..e2837c7d 100644 --- a/libmemcached/server.cc +++ b/libmemcached/server.cc @@ -54,6 +54,8 @@ static inline void _server_init(memcached_server_st *self, Memcached *root, self->request_id= 0; self->server_failure_counter= 0; self->server_failure_counter_query_id= 0; + self->server_timeout_counter= 0; + self->server_timeout_counter_query_id= 0; self->weight= weight ? weight : 1; // 1 is the default weight value self->io_wait_count.read= 0; self->io_wait_count.write= 0; @@ -213,6 +215,24 @@ in_port_t memcached_server_port(const memcached_instance_st * self) return self->port(); } +in_port_t memcached_server_srcport(const memcached_instance_st * self) +{ + WATCHPOINT_ASSERT(self); + if (self == NULL || self->fd == INVALID_SOCKET || (self->type != MEMCACHED_CONNECTION_TCP && self->type != MEMCACHED_CONNECTION_UDP)) + { + return 0; + } + + struct sockaddr_in sin; + socklen_t addrlen= sizeof(sin); + if (getsockname(self->fd, (struct sockaddr*)&sin, &addrlen) != -1) + { + return ntohs(sin.sin_port); + } + + return -1; +} + uint32_t memcached_server_response_count(const memcached_instance_st * self) { WATCHPOINT_ASSERT(self); diff --git a/libmemcached/server.hpp b/libmemcached/server.hpp index 0c6ac798..6ea0b7f2 100644 --- a/libmemcached/server.hpp +++ b/libmemcached/server.hpp @@ -76,22 +76,31 @@ 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->server_timeout_counter_query_id != server->root->query_id) { - 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->server_timeout_counter++; + server->server_timeout_counter_query_id= server->root->query_id; } - server->state= MEMCACHED_SERVER_STATE_IN_TIMEOUT; - if (server->server_failure_counter_query_id != server->root->query_id) + if (server->server_timeout_counter >= server->root->server_timeout_limit) { - server->server_failure_counter++; - server->server_failure_counter_query_id= server->root->query_id; + 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; + if (server->server_failure_counter_query_id != server->root->query_id) + { + server->server_failure_counter++; + server->server_failure_counter_query_id= server->root->query_id; + } + set_last_disconnected_host(server); } - set_last_disconnected_host(server); } } 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 << "<testsuites name=\"" << framework_.name() << "\">" << std::endl; + std::string escaped_string; + + output << "<testsuites name=" + << escape4XML(framework_.name(), escaped_string) << ">" << std::endl; + for (Suites::iterator framework_iter= framework_.suites().begin(); framework_iter != framework_.suites().end(); ++framework_iter) { - output << "\t<testsuite name=\"" << (*framework_iter)->name() << "\" classname=\"\" package=\"\">" << std::endl; + output << "\t<testsuite name=" + << escape4XML((*framework_iter)->name(), escaped_string) +#if 0 + << " classname=\"\" package=\"\"" +#endif + << ">" << std::endl; for (TestCases::iterator case_iter= (*framework_iter)->formatter()->testcases().begin(); case_iter != (*framework_iter)->formatter()->testcases().end(); ++case_iter) { - output << "\t\t<testcase name=\"" - << (*case_iter)->name() - << "\" time=\"" + output << "\t\t<testcase name=" + << escape4XML((*case_iter)->name(), escaped_string) + << " time=\"" << (*case_iter)->timer().elapsed_milliseconds() - << "\">" - << std::endl; + << "\""; switch ((*case_iter)->result()) { case TEST_SKIPPED: + output << ">" << std::endl; output << "\t\t <skipped/>" << std::endl; + output << "\t\t</testcase>" << std::endl; break; case TEST_FAILURE: + output << ">" << std::endl; output << "\t\t <failure message=\"\" type=\"\"/>"<< std::endl; + output << "\t\t</testcase>" << std::endl; break; case TEST_SUCCESS: + output << "/>" << std::endl; break; } - output << "\t\t</testcase>" << std::endl; } output << "\t</testsuite>" << std::endl; } diff --git a/libtest/include.am b/libtest/include.am index 74046e4f..b5f48d1a 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 @@ -173,8 +173,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 @@ -247,7 +249,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 1b1b8076..8652e1f0 100644 --- a/libtest/unittest.cc +++ b/libtest/unittest.cc @@ -577,7 +577,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 9a994a63..a2c92147 100644 --- a/m4/ax_harden_compiler_flags.m4 +++ b/m4/ax_harden_compiler_flags.m4 @@ -211,7 +211,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]) @@ -317,7 +316,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 <filippo@esaurito.net> +# Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2011 Russ Allbery <rra@stanford.edu> +# Copyright (c) 2013 Bastien ROUCARIES <roucaries.bastien+autoconf@gmail.com> # # 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 <filippo@esaurito.net> +# Copyright (c) 2011 The Board of Trustees of the Leland Stanford Junior University +# Copyright (c) 2011 Russ Allbery <rra@stanford.edu> +# Copyright (c) 2013 Bastien ROUCARIES <roucaries.bastien+autoconf@gmail.com> # # 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 467659c6..f9ecc388 100644 --- a/tests/libmemcached-1.0/mem_functions.cc +++ b/tests/libmemcached-1.0/mem_functions.cc @@ -413,6 +413,7 @@ test_return_t clone_test(memcached_st *memc) test_true(memc_clone->retry_timeout == memc->retry_timeout); test_true(memc_clone->send_size == memc->send_size); test_true(memc_clone->server_failure_limit == memc->server_failure_limit); + test_true(memc_clone->server_timeout_limit == memc->server_timeout_limit); test_true(memc_clone->snd_timeout == memc->snd_timeout); test_true(memc_clone->user_data == memc->user_data); @@ -4562,7 +4563,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, @@ -4844,6 +4845,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 52f1d942..2bfa27b9 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(libmemcached_has_feature(LIBMEMCACHED_FEATURE_HAS_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 41fc910b..2c7abaab 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; } |