From 4b32ea1e3881ae88437a49c86b5613a0b52f41a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Thu, 10 Apr 2025 12:17:23 +0200 Subject: [PATCH] Cleanup --- nano/lib/constants.hpp | 6 +-- nano/lib/thread_roles.cpp | 4 +- nano/lib/thread_roles.hpp | 2 +- nano/node/active_elections.cpp | 68 +++++++++++++++++----------------- nano/node/active_elections.hpp | 7 ++-- nano/slow_test/node.cpp | 2 +- 6 files changed, 44 insertions(+), 45 deletions(-) diff --git a/nano/lib/constants.hpp b/nano/lib/constants.hpp index de6e82222..65ce81f93 100644 --- a/nano/lib/constants.hpp +++ b/nano/lib/constants.hpp @@ -84,7 +84,7 @@ public: default_rpc_port (45000), default_ipc_port (46000), default_websocket_port (47000), - aec_loop_interval_ms (300), // Update AEC ~3 times per second + aec_loop_interval (300ms), // Update AEC ~3 times per second cleanup_period (default_cleanup_period), merge_period (std::chrono::milliseconds (250)), keepalive_period (std::chrono::seconds (15)), @@ -120,7 +120,7 @@ public: } else if (is_dev_network ()) { - aec_loop_interval_ms = 20; + aec_loop_interval = 20ms; cleanup_period = std::chrono::seconds (1); merge_period = std::chrono::milliseconds (10); keepalive_period = std::chrono::seconds (1); @@ -147,7 +147,7 @@ public: uint16_t default_rpc_port; uint16_t default_ipc_port; uint16_t default_websocket_port; - unsigned aec_loop_interval_ms; + std::chrono::milliseconds aec_loop_interval; std::chrono::seconds cleanup_period; std::chrono::milliseconds cleanup_period_half () const diff --git a/nano/lib/thread_roles.cpp b/nano/lib/thread_roles.cpp index a7a991741..af3bf9452 100644 --- a/nano/lib/thread_roles.cpp +++ b/nano/lib/thread_roles.cpp @@ -46,8 +46,8 @@ std::string nano::thread_role::get_string (nano::thread_role::name role) case nano::thread_role::name::ledger_notifications: thread_role_name_string = "Ledger notif"; break; - case nano::thread_role::name::request_loop: - thread_role_name_string = "Request loop"; + case nano::thread_role::name::aec_loop: + thread_role_name_string = "AEC"; break; case nano::thread_role::name::wallet_actions: thread_role_name_string = "Wallet actions"; diff --git a/nano/lib/thread_roles.hpp b/nano/lib/thread_roles.hpp index fb4bcd5e2..83c842d66 100644 --- a/nano/lib/thread_roles.hpp +++ b/nano/lib/thread_roles.hpp @@ -20,7 +20,7 @@ enum class name vote_rebroadcasting, block_processing, ledger_notifications, - request_loop, + aec_loop, wallet_actions, bootstrap_initiator, bootstrap_connections, diff --git a/nano/node/active_elections.cpp b/nano/node/active_elections.cpp index 9845e0d28..ddf2fba48 100644 --- a/nano/node/active_elections.cpp +++ b/nano/node/active_elections.cpp @@ -94,8 +94,8 @@ void nano::active_elections::start () debug_assert (!thread.joinable ()); thread = std::thread ([this] () { - nano::thread_role::set (nano::thread_role::name::request_loop); - request_loop (); + nano::thread_role::set (nano::thread_role::name::aec_loop); + run (); }); } @@ -110,6 +110,27 @@ void nano::active_elections::stop () clear (); } +void nano::active_elections::run () +{ + nano::unique_lock lock{ mutex }; + while (!stopped) + { + auto const stamp = std::chrono::steady_clock::now (); + + node.stats.inc (nano::stat::type::active, nano::stat::detail::loop); + + tick_elections (lock); + debug_assert (lock.owns_lock ()); + + auto const min_sleep = node.network_params.network.aec_loop_interval / 2; + auto const wakeup = std::max (stamp + node.network_params.network.aec_loop_interval, std::chrono::steady_clock::now () + min_sleep); + + condition.wait_until (lock, wakeup, [this, wakeup] { + return stopped || std::chrono::steady_clock::now () >= wakeup; + }); + } +} + auto nano::active_elections::block_cemented (std::shared_ptr const & block, nano::block_hash const & confirmation_root, std::shared_ptr const & source_election) -> block_cemented_result { debug_assert (!mutex.try_lock ()); @@ -245,14 +266,13 @@ int64_t nano::active_elections::vacancy (nano::election_behavior behavior) const return std::min (election_vacancy (behavior), election_winners_vacancy ()); } -void nano::active_elections::request_confirm (nano::unique_lock & lock_a) +void nano::active_elections::tick_elections (nano::unique_lock & lock) { - debug_assert (lock_a.owns_lock ()); + debug_assert (lock.owns_lock ()); - std::size_t const this_loop_target_l (roots.size ()); - auto const elections_l{ list_active_impl (this_loop_target_l) }; + auto const elections_l = list_active_impl (); - lock_a.unlock (); + lock.unlock (); nano::confirmation_solicitor solicitor (node.network, node.config); solicitor.prepare (node.rep_crawler.principal_representatives (std::numeric_limits::max ())); @@ -279,7 +299,7 @@ void nano::active_elections::request_confirm (nano::unique_lock & l } solicitor.flush (); - lock_a.lock (); + lock.lock (); } void nano::active_elections::cleanup_election (nano::unique_lock & lock_a, std::shared_ptr election) @@ -342,20 +362,19 @@ void nano::active_elections::cleanup_election (nano::unique_lock & } } -std::vector> nano::active_elections::list_active (std::size_t max_a) +std::vector> nano::active_elections::list_active (std::size_t max_count) { nano::lock_guard guard{ mutex }; - return list_active_impl (max_a); + return list_active_impl (max_count); } -std::vector> nano::active_elections::list_active_impl (std::size_t max_a) const +std::vector> nano::active_elections::list_active_impl (std::size_t max_count) const { std::vector> result_l; - result_l.reserve (std::min (max_a, roots.size ())); + result_l.reserve (std::min (max_count, roots.size ())); { auto & sorted_roots_l (roots.get ()); - std::size_t count_l{ 0 }; - for (auto i = sorted_roots_l.begin (), n = sorted_roots_l.end (); i != n && count_l < max_a; ++i, ++count_l) + for (auto i = sorted_roots_l.begin (), n = sorted_roots_l.end (); i != n && result_l.size () < max_count; ++i) { result_l.push_back (i->election); } @@ -363,27 +382,6 @@ std::vector> nano::active_elections::list_active return result_l; } -void nano::active_elections::request_loop () -{ - nano::unique_lock lock{ mutex }; - while (!stopped) - { - auto const stamp_l = std::chrono::steady_clock::now (); - - node.stats.inc (nano::stat::type::active, nano::stat::detail::loop); - - request_confirm (lock); - debug_assert (lock.owns_lock ()); - - if (!stopped) - { - auto const min_sleep_l = std::chrono::milliseconds (node.network_params.network.aec_loop_interval_ms / 2); - auto const wakeup_l = std::max (stamp_l + std::chrono::milliseconds (node.network_params.network.aec_loop_interval_ms), std::chrono::steady_clock::now () + min_sleep_l); - condition.wait_until (lock, wakeup_l, [&wakeup_l, &stopped = stopped] { return stopped || std::chrono::steady_clock::now () >= wakeup_l; }); - } - } -} - nano::election_insertion_result nano::active_elections::insert (std::shared_ptr const & block_a, nano::election_behavior election_behavior_a, erased_callback_t erased_callback_a) { debug_assert (block_a); diff --git a/nano/node/active_elections.hpp b/nano/node/active_elections.hpp index d7c863f48..5ef6a994d 100644 --- a/nano/node/active_elections.hpp +++ b/nano/node/active_elections.hpp @@ -129,8 +129,9 @@ public: // Events nano::observer_set<> vacancy_updated; private: - void request_loop (); - void request_confirm (nano::unique_lock &); + void run (); + void tick_elections (nano::unique_lock &); + // Erase all blocks from active and, if not confirmed, clear digests from network filters void cleanup_election (nano::unique_lock & lock_a, std::shared_ptr); @@ -139,7 +140,7 @@ private: void notify_observers (nano::secure::transaction const &, nano::election_status const & status, std::vector const & votes) const; std::shared_ptr election_impl (nano::qualified_root const &) const; - std::vector> list_active_impl (std::size_t max_count) const; + std::vector> list_active_impl (std::size_t max_count = std::numeric_limits::max ()) const; private: // Dependencies active_elections_config const & config; diff --git a/nano/slow_test/node.cpp b/nano/slow_test/node.cpp index 9bd9863cb..7245ffc26 100644 --- a/nano/slow_test/node.cpp +++ b/nano/slow_test/node.cpp @@ -1776,7 +1776,7 @@ TEST (node, mass_block_new) nano::node_config node_config = system.default_config (); node_config.backlog_scan.enable = false; auto & node = *system.add_node (node_config); - node.network_params.network.aec_loop_interval_ms = 500; + node.network_params.network.aec_loop_interval = 500ms; #ifndef NDEBUG auto const num_blocks = 5000;