From cb40ed6f40021877f06fcf1b15f9589dcbe94273 Mon Sep 17 00:00:00 2001 From: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> Date: Mon, 16 Feb 2026 16:49:29 +0000 Subject: [PATCH] tring to fix the thread race in BasicApp Signed-off-by: Pratik Mankawde <3397372+pratikmankawde@users.noreply.github.com> --- .github/workflows/reusable-build-test-config.yml | 6 +++--- sanitizers/suppressions/tsan.supp | 1 - src/xrpld/app/main/Application.cpp | 2 ++ src/xrpld/app/main/BasicApp.cpp | 15 ++++++++++----- src/xrpld/app/main/BasicApp.h | 5 +++++ 5 files changed, 20 insertions(+), 9 deletions(-) diff --git a/.github/workflows/reusable-build-test-config.yml b/.github/workflows/reusable-build-test-config.yml index b976054164..2b758e44d4 100644 --- a/.github/workflows/reusable-build-test-config.yml +++ b/.github/workflows/reusable-build-test-config.yml @@ -205,10 +205,10 @@ jobs: - name: Set sanitizer options if: ${{ !inputs.build_only && env.SANITIZERS_ENABLED == 'true' }} run: | - echo "ASAN_OPTIONS=print_stacktrace=1:detect_container_overflow=0" >> ${GITHUB_ENV} + echo "ASAN_OPTIONS=print_stacktrace=1:detect_container_overflow=0:suppressions=${GITHUB_WORKSPACE}/sanitizers/suppressions/asan.supp" >> ${GITHUB_ENV} echo "TSAN_OPTIONS=second_deadlock_stack=1:halt_on_error=0" >> ${GITHUB_ENV} - # echo "UBSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/sanitizers/suppressions/ubsan.supp" >> ${GITHUB_ENV} - # echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/sanitizers/suppressions/lsan.supp" >> ${GITHUB_ENV} + echo "UBSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/sanitizers/suppressions/ubsan.supp" >> ${GITHUB_ENV} + echo "LSAN_OPTIONS=suppressions=${GITHUB_WORKSPACE}/sanitizers/suppressions/lsan.supp" >> ${GITHUB_ENV} - name: Run the separate tests if: ${{ !inputs.build_only }} diff --git a/sanitizers/suppressions/tsan.supp b/sanitizers/suppressions/tsan.supp index 74f3371e68..1626a90aa0 100644 --- a/sanitizers/suppressions/tsan.supp +++ b/sanitizers/suppressions/tsan.supp @@ -31,7 +31,6 @@ race:src/test/jtx/impl/token.cpp race:src/test/rpc/Book_test.cpp race:src/xrpld/app/ledger/detail/InboundTransactions.cpp race:src/xrpld/app/main/Application.cpp -race:src/xrpld/app/main/BasicApp.cpp race:src/xrpld/app/main/GRPCServer.cpp race:src/xrpld/app/misc/detail/AmendmentTable.cpp race:src/xrpld/app/misc/FeeVoteImpl.cpp diff --git a/src/xrpld/app/main/Application.cpp b/src/xrpld/app/main/Application.cpp index 4612479b78..6cf5e028ee 100644 --- a/src/xrpld/app/main/Application.cpp +++ b/src/xrpld/app/main/Application.cpp @@ -1035,6 +1035,8 @@ private: bool ApplicationImp::setup(boost::program_options::variables_map const& cmdline) { + startIOThreads(); + // We want to intercept CTRL-C and the standard termination signal SIGTERM // and terminate the process. This handler will NEVER be invoked twice. // diff --git a/src/xrpld/app/main/BasicApp.cpp b/src/xrpld/app/main/BasicApp.cpp index be0c158b85..20fb5369d6 100644 --- a/src/xrpld/app/main/BasicApp.cpp +++ b/src/xrpld/app/main/BasicApp.cpp @@ -4,15 +4,20 @@ #include -BasicApp::BasicApp(std::size_t numberOfThreads) +BasicApp::BasicApp(std::size_t numberOfThreads) : numberOfThreads_(numberOfThreads) { work_.emplace(boost::asio::make_work_guard(io_context_)); - threads_.reserve(numberOfThreads); +} - while (numberOfThreads--) +void +BasicApp::startIOThreads() +{ + threads_.reserve(numberOfThreads_); + + while (numberOfThreads_--) { - threads_.emplace_back([this, numberOfThreads]() { - beast::setCurrentThreadName("io svc #" + std::to_string(numberOfThreads)); + threads_.emplace_back([this, n = numberOfThreads_]() { + beast::setCurrentThreadName("io svc #" + std::to_string(n)); this->io_context_.run(); }); } diff --git a/src/xrpld/app/main/BasicApp.h b/src/xrpld/app/main/BasicApp.h index 278c255af3..779467f69e 100644 --- a/src/xrpld/app/main/BasicApp.h +++ b/src/xrpld/app/main/BasicApp.h @@ -13,6 +13,7 @@ private: std::optional> work_; std::vector threads_; boost::asio::io_context io_context_; + std::size_t numberOfThreads_; public: BasicApp(std::size_t numberOfThreads); @@ -23,4 +24,8 @@ public: { return io_context_; } + +protected: + void + startIOThreads(); };