From 2fb1affc583b360d4d17423bc6a0a1b514aa3008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Piotr=20Wo=CC=81jcik?= <3044353+pwojcikdev@users.noreply.github.com> Date: Wed, 22 May 2024 19:34:44 +0200 Subject: [PATCH] Optimize full bucket case --- nano/lib/stats_enums.hpp | 1 + nano/node/scheduler/bucket.cpp | 10 +++++++--- nano/node/scheduler/bucket.hpp | 2 +- nano/node/scheduler/buckets.cpp | 5 +++-- nano/node/scheduler/buckets.hpp | 3 ++- nano/node/scheduler/priority.cpp | 27 +++++++++++++++++---------- 6 files changed, 31 insertions(+), 17 deletions(-) diff --git a/nano/lib/stats_enums.hpp b/nano/lib/stats_enums.hpp index 266c7d88..c5b82892 100644 --- a/nano/lib/stats_enums.hpp +++ b/nano/lib/stats_enums.hpp @@ -365,6 +365,7 @@ enum class detail activated, activate_failed, activate_skip, + activate_full, // active insert, diff --git a/nano/node/scheduler/bucket.cpp b/nano/node/scheduler/bucket.cpp index 10aa78fc..7af2688c 100644 --- a/nano/node/scheduler/bucket.cpp +++ b/nano/node/scheduler/bucket.cpp @@ -34,14 +34,18 @@ void nano::scheduler::bucket::pop () queue.erase (queue.begin ()); } -void nano::scheduler::bucket::push (uint64_t time, std::shared_ptr block) +// Returns true if the block was inserted +bool nano::scheduler::bucket::push (uint64_t time, std::shared_ptr block) { - queue.insert ({ time, block }); + auto [it, inserted] = queue.insert ({ time, block }); + release_assert (!queue.empty ()); + bool was_last = (it == --queue.end ()); if (queue.size () > maximum) { - debug_assert (!queue.empty ()); queue.erase (--queue.end ()); + return inserted && !was_last; } + return inserted; } size_t nano::scheduler::bucket::size () const diff --git a/nano/node/scheduler/bucket.hpp b/nano/node/scheduler/bucket.hpp index 7c5ccfbd..d46296d5 100644 --- a/nano/node/scheduler/bucket.hpp +++ b/nano/node/scheduler/bucket.hpp @@ -34,7 +34,7 @@ public: std::shared_ptr top () const; void pop (); - void push (uint64_t time, std::shared_ptr block); + bool push (uint64_t time, std::shared_ptr block); size_t size () const; bool empty () const; void dump () const; diff --git a/nano/node/scheduler/buckets.cpp b/nano/node/scheduler/buckets.cpp index 8d263188..ee543941 100644 --- a/nano/node/scheduler/buckets.cpp +++ b/nano/node/scheduler/buckets.cpp @@ -69,15 +69,16 @@ nano::scheduler::buckets::~buckets () * Push a block and its associated time into the prioritization container. * The time is given here because sideband might not exist in the case of state blocks. */ -void nano::scheduler::buckets::push (uint64_t time, std::shared_ptr block, nano::amount const & priority) +bool nano::scheduler::buckets::push (uint64_t time, std::shared_ptr block, nano::amount const & priority) { auto was_empty = empty (); auto & bucket = find_bucket (priority.number ()); - bucket.push (time, block); + bool added = bucket.push (time, block); if (was_empty) { seek (); } + return added; } /** Return the highest priority block of the current bucket */ diff --git a/nano/node/scheduler/buckets.hpp b/nano/node/scheduler/buckets.hpp index 66d6d22c..e3837622 100644 --- a/nano/node/scheduler/buckets.hpp +++ b/nano/node/scheduler/buckets.hpp @@ -42,7 +42,8 @@ class buckets final public: buckets (uint64_t maximum = 250000u); ~buckets (); - void push (uint64_t time, std::shared_ptr block, nano::amount const & priority); + // Returns true if the block was inserted + bool push (uint64_t time, std::shared_ptr block, nano::amount const & priority); std::shared_ptr top () const; void pop (); std::size_t size () const; diff --git a/nano/node/scheduler/priority.cpp b/nano/node/scheduler/priority.cpp index 3d9ecd33..6e7d7100 100644 --- a/nano/node/scheduler/priority.cpp +++ b/nano/node/scheduler/priority.cpp @@ -60,7 +60,6 @@ bool nano::scheduler::priority::activate (secure::transaction const & transactio return activate (transaction, account, *info, conf_info); } } - stats.inc (nano::stat::type::election_scheduler, nano::stat::detail::activate_skip); return false; // Not activated } @@ -79,18 +78,26 @@ bool nano::scheduler::priority::activate (secure::transaction const & transactio auto const previous_balance = node.ledger.any.block_balance (transaction, conf_info.frontier).value_or (0); auto const balance_priority = std::max (balance, previous_balance); - node.stats.inc (nano::stat::type::election_scheduler, nano::stat::detail::activated); - node.logger.trace (nano::log::type::election_scheduler, nano::log::detail::block_activated, - nano::log::arg{ "account", account.to_account () }, // TODO: Convert to lazy eval - nano::log::arg{ "block", block }, - nano::log::arg{ "time", account_info.modified }, - nano::log::arg{ "priority", balance_priority }); - + bool added = false; { nano::lock_guard lock{ mutex }; - buckets->push (account_info.modified, block, balance_priority); + added = buckets->push (account_info.modified, block, balance_priority); + } + if (added) + { + node.stats.inc (nano::stat::type::election_scheduler, nano::stat::detail::activated); + node.logger.trace (nano::log::type::election_scheduler, nano::log::detail::block_activated, + nano::log::arg{ "account", account.to_account () }, // TODO: Convert to lazy eval + nano::log::arg{ "block", block }, + nano::log::arg{ "time", account_info.modified }, + nano::log::arg{ "priority", balance_priority }); + + notify (); + } + else + { + node.stats.inc (nano::stat::type::election_scheduler, nano::stat::detail::activate_full); } - notify (); return true; // Activated }