From afd3eae65bed51fd3a7f57918c877de6bccfe030 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 28 Sep 2018 09:15:02 +0300 Subject: [PATCH 1/4] Add more output to mxs1743_rconn_bitmask The test times out but it doesn't tell where it times out. --- maxscale-system-test/mxs1743_rconn_bitmask.cpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/maxscale-system-test/mxs1743_rconn_bitmask.cpp b/maxscale-system-test/mxs1743_rconn_bitmask.cpp index 1116fb9b0..d32a82a46 100644 --- a/maxscale-system-test/mxs1743_rconn_bitmask.cpp +++ b/maxscale-system-test/mxs1743_rconn_bitmask.cpp @@ -44,8 +44,13 @@ int main(int argc, char** argv) execute_query_silent(test.repl->nodes[0], "DROP USER IF EXISTS 'mxs1743'@'%'"); test.try_query(test.repl->nodes[0], "%s", "CREATE USER 'mxs1743'@'%' IDENTIFIED BY 'mxs1743'"); test.try_query(test.repl->nodes[0], "%s", "GRANT ALL ON *.* TO 'mxs1743'@'%'"); + + test.tprintf("Syncing slaves"); + test.set_timeout(60); test.repl->sync_slaves(); + test.tprintf("Opening new connections to verify readconnroute works"); + for (int i = 0; i < 20; i++) { // Open a connection and make sure it works @@ -60,6 +65,7 @@ int main(int argc, char** argv) // Give the connections a few seconds to establish sleep(5); + test.tprintf("Checking the number of connections"); std::string query = "SELECT COUNT(*) AS connections FROM information_schema.processlist WHERE user = 'mxs1743'"; char master_connections[1024]; char slave_connections[1024]; From 5b644a785b21ded07b8e01f511e1a02c77ecc15f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 28 Sep 2018 09:24:48 +0300 Subject: [PATCH 2/4] Refactor mxs682_cyrillic Use stack allocated objects and do general cleanup. Increased timeouts to be a bit more forgiving. --- maxscale-system-test/mxs682_cyrillic.cpp | 112 +++++++---------------- 1 file changed, 31 insertions(+), 81 deletions(-) diff --git a/maxscale-system-test/mxs682_cyrillic.cpp b/maxscale-system-test/mxs682_cyrillic.cpp index 7189cde5e..ade3ad5f9 100644 --- a/maxscale-system-test/mxs682_cyrillic.cpp +++ b/maxscale-system-test/mxs682_cyrillic.cpp @@ -4,97 +4,47 @@ * - check SELECT from backend */ - - -#include -#include #include "testconnections.h" -#include -using namespace std; - -void check_val(MYSQL* conn, TestConnections* Test) +void check_val(MYSQL* conn, TestConnections& test) { - char val[256]; - Test->set_timeout(20); + char val[256] = ""; + test.set_timeout(30); find_field(conn, "SELECT * FROM t2", "x", val); - - Test->tprintf("result: %s\n", val); - - if (strcmp("Кот", val) != 0 ) - { - Test->add_result(1, "Wrong SELECT result: %s\n", val); - } + test.tprintf("result: %s\n", val); + test.add_result(strcmp("Кот", val) != 0, "Wrong SELECT result: %s\n", val); + test.stop_timeout(); } int main(int argc, char *argv[]) { - TestConnections * Test = new TestConnections(argc, argv); - Test->set_timeout(10); + TestConnections test(argc, argv); + Mariadb_nodes* nodes = strstr(test.test_name, "galera") ? test.galera : test.repl; - Mariadb_nodes * nodes; - if (strstr(Test->test_name, "galera") != NULL) + test.set_timeout(60); + + test.maxscales->connect(); + + auto conn = test.maxscales->conn_rwsplit[0]; + execute_query_silent(conn, "DROP TABLE t2;"); + test.try_query(conn, "CREATE TABLE t2 (x varchar(10));"); + test.try_query(conn, "INSERT INTO t2 VALUES (\"Кот\");"); + + test.maxscales->disconnect(); + + test.stop_timeout(); + test.repl->connect(); + test.repl->sync_slaves(); + + test.set_timeout(60); + check_val(test.maxscales->conn_rwsplit[0], test); + check_val(test.maxscales->conn_master[0], test); + check_val(test.maxscales->conn_slave[0], test); + + for (int i = 0; i < test.repl->N; i++) { - nodes = Test->galera; - Test->tprintf("Galera!\n"); - } - else - { - nodes = Test->repl; + check_val(nodes->nodes[i], test); } - - /* - iconv_t converter = iconv_open ("koi8-r", "utf-8"); - Test->tprintf("errno %d\n", errno); - - char in_buf[] = "Кот"; - char out_buf[100]; - char *in_ptr = in_buf; - char *out_ptr = out_buf; - size_t in_size = strlen(in_buf); - size_t out_size = 100; - - size_t n = iconv(converter, &in_ptr, &in_size, &out_ptr, &out_size); - - Test->tprintf("n = %d\n", n); - //Test->tprintf("UTF-8: %s\n", out_buf); - - iconv_close(converter); - */ - - Test->maxscales->connect_maxscale(0); - Test->set_timeout(10); - nodes->connect(); - - Test->set_timeout(10); - MYSQL * conn = Test->maxscales->conn_rwsplit[0]; - - //Test->try_query(conn, (char *) "set names utf8mb4;"); - execute_query_silent(conn, (char *) "DROP TABLE t2;"); - Test->try_query(conn, (char *) "CREATE TABLE t2 (x varchar(10));"); - char sql[256]; - sprintf(sql, "INSERT INTO t2 VALUES (\"Кот\");"); - Test->try_query(conn, sql); - Test->stop_timeout(); - sleep(5); - - check_val(Test->maxscales->conn_rwsplit[0], Test); - check_val(Test->maxscales->conn_master[0], Test); - check_val(Test->maxscales->conn_slave[0], Test); - - for (int i = 0; i < Test->repl->N; i++) - { - Test->tprintf("Node %d\n", i); - check_val(nodes->nodes[i], Test); - } - - //execute_query_silent(conn, (char *) "DROP TABLE t2;"); - - Test->check_maxscale_alive(0); - int rval = Test->global_result; - delete Test; - return rval; + return test.global_result; } - - From 104a6d1bfba4d705f5bed3ed7dc09ca0c47462ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 28 Sep 2018 11:05:51 +0300 Subject: [PATCH 3/4] Explicitly link against ASAN libraries Some systems (Ubuntu Trusty) require explicit linking against ASAN libraries. --- avro/CMakeLists.txt | 4 ++++ server/core/CMakeLists.txt | 10 ++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/avro/CMakeLists.txt b/avro/CMakeLists.txt index cef0e2e05..81c0bb9ca 100644 --- a/avro/CMakeLists.txt +++ b/avro/CMakeLists.txt @@ -3,6 +3,10 @@ if (AVRO_FOUND AND JANSSON_FOUND) add_library(maxavro maxavro.c maxavro_schema.c maxavro_record.c maxavro_file.c) target_link_libraries(maxavro maxscale-common ${JANSSON_LIBRARIES}) + if(WITH_ASAN AND ASAN_FOUND) + target_link_libraries(maxavro ${ASAN_LIBRARIES}) + endif() + add_executable(maxavrocheck maxavrocheck.c) target_link_libraries(maxavrocheck maxavro) install_executable(maxavrocheck core) diff --git a/server/core/CMakeLists.txt b/server/core/CMakeLists.txt index 503adf401..ce39307e7 100644 --- a/server/core/CMakeLists.txt +++ b/server/core/CMakeLists.txt @@ -54,12 +54,6 @@ add_library(maxscale-common SHARED workertask.cc ) -if(WITH_JEMALLOC) - target_link_libraries(maxscale-common ${JEMALLOC_LIBRARIES}) -elseif(WITH_TCMALLOC) - target_link_libraries(maxscale-common ${TCMALLOC_LIBRARIES}) -endif() - target_link_libraries(maxscale-common ${MARIADB_CONNECTOR_LIBRARIES} ${LZMA_LINK_FLAGS} @@ -80,6 +74,10 @@ target_link_libraries(maxscale-common ${MICROHTTPD_LIBRARIES} ) +if(WITH_ASAN AND ASAN_FOUND) + target_link_libraries(maxscale-common ${ASAN_LIBRARIES}) +endif() + find_library(HAVE_LIBDL NAMES dl) if (HAVE_LIBDL) # libdl just exposes libc functionality on most systems. This means that if From 4554bd1743f86a98e469e0fe6819b3fb3c4e8194 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Fri, 28 Sep 2018 23:49:45 +0300 Subject: [PATCH 4/4] Cherry-pick: Fix ASAN problems Cherry-picking the commit from develop since it's also needed for 2.2. FindASAN did not look for so version 5 and TSAN referred to ASAN. Disable leak checks for unit tests as some objects always leak, namely servers. --- BUILD/build_rpm_local.sh | 2 ++ cmake/FindASAN.cmake | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/BUILD/build_rpm_local.sh b/BUILD/build_rpm_local.sh index 42d9e7798..136d072e7 100755 --- a/BUILD/build_rpm_local.sh +++ b/BUILD/build_rpm_local.sh @@ -14,6 +14,8 @@ make if [[ "$cmake_flags" =~ "BUILD_TESTS" ]] then + # We don't care about memory leaks in the tests (e.g. servers are never freed) + export ASAN_OPTIONS=detect_leaks=0 # All tests must pass otherwise the build is considered a failure ctest --output-on-failure || exit 1 fi diff --git a/cmake/FindASAN.cmake b/cmake/FindASAN.cmake index dea230ea3..a94427581 100644 --- a/cmake/FindASAN.cmake +++ b/cmake/FindASAN.cmake @@ -4,7 +4,7 @@ # ASAN_FOUND - If AddressSanitizer was found # ASAN_LIBRARIES - Path to the libasan library -find_library(ASAN_LIBRARIES NAMES libasan.so.0 libasan.so.3 libasan.so.4) +find_library(ASAN_LIBRARIES NAMES libasan.so.0 libasan.so.1 libasan.so.2 libasan.so.3 libasan.so.4 libasan.so.5) if (ASAN_LIBRARIES) message(STATUS "Found AdressSanitizer libraries: ${ASAN_LIBRARIES}")