From 325f2dc22f131775c7bc4f677c26303ea033aa3e Mon Sep 17 00:00:00 2001 From: SChernykh Date: Wed, 17 May 2023 23:06:54 +0200 Subject: [PATCH] Sync test: run with TSAN on Ubuntu --- .github/workflows/test-sync.yml | 4 ++-- CMakeLists.txt | 5 +++++ cmake/flags.cmake | 12 +++++++++++- src/log.cpp | 4 ++++ tests/src/tsan_sup.txt | 4 ++++ 5 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 tests/src/tsan_sup.txt diff --git a/.github/workflows/test-sync.yml b/.github/workflows/test-sync.yml index ef7aeaa..a44c07a 100644 --- a/.github/workflows/test-sync.yml +++ b/.github/workflows/test-sync.yml @@ -24,7 +24,7 @@ jobs: run: | mkdir build cd build - cmake .. -DDEV_TEST_SYNC=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 + cmake .. -DDEV_TEST_SYNC=ON -DDEV_WITH_TSAN=ON -DCMAKE_C_COMPILER=gcc-12 -DCMAKE_CXX_COMPILER=g++-12 make -j$(nproc) - name: Run p2pool @@ -35,7 +35,7 @@ jobs: python ../tests/src/stratum_dummy.py stratum_dummy1.log & python ../tests/src/stratum_dummy.py stratum_dummy2.log & python ../tests/src/stratum_dummy.py stratum_dummy3.log & - ./p2pool --host p2pmd.xmrvsbeast.com --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6 + TSAN_OPTIONS="suppressions=../tests/src/tsan_sup.txt halt_on_error=1" ./p2pool --host p2pmd.xmrvsbeast.com --zmq-port 18084 --wallet 44MnN1f3Eto8DZYUWuE5XZNUtE3vcRzt2j6PzqWpPau34e6Cf4fAxt6X2MBmrm6F9YMEiMNjN6W4Shn4pLcfNAja621jwyg --data-api data --local-api --loglevel 6 grep 'Synchronization finished successfully' p2pool.log - name: Archive p2pool.log diff --git a/CMakeLists.txt b/CMakeLists.txt index 4df6883..94b99f9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -8,6 +8,7 @@ option(WITH_LTO "Use link-time compiler optimization (if linking fails for you, option(WITH_UPNP "Include UPnP support. If this is turned off, p2pool will not be able to configure port forwarding on UPnP-enabled routers." ON) option(DEV_TEST_SYNC "[Developer only] Sync test, stop p2pool after sync is complete" OFF) +option(DEV_WITH_TSAN "[Developer only] Compile with thread sanitizer" OFF) set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake") @@ -31,6 +32,10 @@ if (DEV_TEST_SYNC) add_definitions(-DDEV_TEST_SYNC) endif() +if (DEV_WITH_TSAN) + add_definitions(-DDEV_WITH_TSAN) +endif() + include(cmake/flags.cmake) set(HEADERS diff --git a/cmake/flags.cmake b/cmake/flags.cmake index 25e7746..b41d6ef 100644 --- a/cmake/flags.cmake +++ b/cmake/flags.cmake @@ -7,8 +7,18 @@ set(CMAKE_C_STANDARD_REQUIRED ON) if (CMAKE_CXX_COMPILER_ID MATCHES GNU) set(GENERAL_FLAGS "-pthread") + + if (DEV_WITH_TSAN) + set(GENERAL_FLAGS "${GENERAL_FLAGS} -fno-omit-frame-pointer -fsanitize=thread") + endif() + set(WARNING_FLAGS "-Wall -Wextra -Wcast-align -Wcast-qual -Wlogical-op -Wstrict-overflow=2 -Wundef -Wformat=2 -Wpointer-arith -Werror") - set(OPTIMIZATION_FLAGS "-Ofast -s") + + if (DEV_WITH_TSAN) + set(OPTIMIZATION_FLAGS "-O2 -g") + else() + set(OPTIMIZATION_FLAGS "-Ofast -s") + endif() if (WITH_LTO) set(OPTIMIZATION_FLAGS "${OPTIMIZATION_FLAGS} -flto -fuse-linker-plugin") diff --git a/src/log.cpp b/src/log.cpp index e1cdfb8..0fec053 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -154,7 +154,9 @@ public: memcpy(p + 1, buf + 1, size - 1); // Ensure memory order in the writer thread +#ifndef DEV_WITH_TSAN std::atomic_thread_fence(std::memory_order_seq_cst); +#endif // Mark that everything is written into this log slot p[0] = buf[0] + 1; @@ -221,7 +223,9 @@ private: } // Ensure memory order in the reader thread +#ifndef DEV_WITH_TSAN std::atomic_thread_fence(std::memory_order_seq_cst); +#endif uint32_t size = static_cast(p[2]); size = (size << 8) + static_cast(p[1]); diff --git a/tests/src/tsan_sup.txt b/tests/src/tsan_sup.txt new file mode 100644 index 0000000..f9c7869 --- /dev/null +++ b/tests/src/tsan_sup.txt @@ -0,0 +1,4 @@ +race:p2pool::log::Worker::run() +race:p2pool::log::Worker::write +called_from_lib:libzmq.so +race_top:do_loglevel