From adbb93a5c5c7f0ca7a08984f2cd4855268154d7a Mon Sep 17 00:00:00 2001 From: Wesley Shillingford Date: Sat, 13 Apr 2019 17:14:50 +0100 Subject: [PATCH] Remove delay exiting node in request processor (#1904) * Remove delay exiting node * Make stopped atomic --- nano/node/node.cpp | 9 ++++++++- nano/node/node.hpp | 2 +- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 59b66c66..62579a1c 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -2775,7 +2775,7 @@ void nano::active_transactions::confirm_frontiers (nano::transaction const & tra { size_t max_elections (max_broadcast_queue / 4); size_t elections_count (0); - for (auto i (node.store.latest_begin (transaction_a, next_frontier_account)), n (node.store.latest_end ()); i != n && elections_count < max_elections; ++i) + for (auto i (node.store.latest_begin (transaction_a, next_frontier_account)), n (node.store.latest_end ()); i != n && !stopped && elections_count < max_elections; ++i) { nano::account_info info (i->second); if (info.block_count != info.confirmation_height) @@ -3070,6 +3070,13 @@ void nano::active_transactions::request_loop () while (!stopped) { request_confirm (lock); + + // This prevents unnecessary waiting if stopped is set in-between the above check and now + if (stopped) + { + break; + } + const auto extra_delay (std::min (roots.size (), max_broadcast_queue) * node.network.broadcast_interval_ms * 2); condition.wait_for (lock, std::chrono::milliseconds (node.network_params.network.request_interval_ms + extra_delay)); } diff --git a/nano/node/node.hpp b/nano/node/node.hpp index 7cff33fb..05a4a0b1 100644 --- a/nano/node/node.hpp +++ b/nano/node/node.hpp @@ -158,7 +158,7 @@ private: std::chrono::steady_clock::time_point next_frontier_check{ std::chrono::steady_clock::now () }; std::condition_variable condition; bool started; - bool stopped; + std::atomic stopped; boost::thread thread; };