diff --git a/nano/core_test/bootstrap.cpp b/nano/core_test/bootstrap.cpp index 2c13390a1..1073a83a3 100644 --- a/nano/core_test/bootstrap.cpp +++ b/nano/core_test/bootstrap.cpp @@ -55,6 +55,7 @@ TEST (account_sets, block) nano::account account{ 1 }; nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; + sets.priority_up (account); sets.block (account, random_hash ()); ASSERT_TRUE (sets.blocked (account)); } @@ -67,7 +68,9 @@ TEST (account_sets, unblock) nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; auto hash = random_hash (); + sets.priority_up (account); sets.block (account, hash); + ASSERT_TRUE (sets.blocked (account)); sets.unblock (account, hash); ASSERT_FALSE (sets.blocked (account)); } @@ -93,8 +96,7 @@ TEST (account_sets, priority_blocked) ASSERT_EQ (0.0, sets.priority (account)); } -// When account is unblocked, check that it retains it former priority -TEST (account_sets, priority_unblock_keep) +TEST (account_sets, priority_unblock) { nano::test::system system; @@ -102,13 +104,12 @@ TEST (account_sets, priority_unblock_keep) nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; sets.priority_up (account); - sets.priority_up (account); - ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial + nano::bootstrap::account_sets::priority_increase); + ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial); auto hash = random_hash (); sets.block (account, hash); ASSERT_EQ (0.0, sets.priority (account)); sets.unblock (account, hash); - ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial + nano::bootstrap::account_sets::priority_increase); + ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial); } TEST (account_sets, priority_up_down) diff --git a/nano/lib/stats_enums.hpp b/nano/lib/stats_enums.hpp index 9e3086d2e..ab5146809 100644 --- a/nano/lib/stats_enums.hpp +++ b/nano/lib/stats_enums.hpp @@ -467,6 +467,7 @@ enum class detail prioritize, prioritize_failed, block, + block_failed, unblock, unblock_failed, dependency_update, @@ -490,6 +491,7 @@ enum class detail blocking_overflow, priority_insert, priority_set, + priority_unblocked, erase_by_threshold, erase_by_blocking, priority_overflow, diff --git a/nano/node/bootstrap/account_sets.cpp b/nano/node/bootstrap/account_sets.cpp index 4093644f5..98d705dbd 100644 --- a/nano/node/bootstrap/account_sets.cpp +++ b/nano/node/bootstrap/account_sets.cpp @@ -105,18 +105,20 @@ void nano::bootstrap::account_sets::block (nano::account const & account, nano:: { debug_assert (!account.is_zero ()); - stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::block); + auto erased = priorities.get ().erase (account); + if (erased > 0) + { + stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::erase_by_blocking); + stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::block); - auto existing = priorities.get ().find (account); - auto entry = (existing == priorities.get ().end ()) ? priority_entry{ account, 0 } : *existing; - - priorities.get ().erase (account); - stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::erase_by_blocking); - - blocking.get ().insert ({ entry, dependency }); - stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::blocking_insert); - - trim_overflow (); + debug_assert (blocking.get ().count (account) == 0); + blocking.get ().insert ({ account, dependency }); + trim_overflow (); + } + else + { + stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::block_failed); + } } void nano::bootstrap::account_sets::unblock (nano::account const & account, std::optional const & hash) @@ -131,19 +133,11 @@ void nano::bootstrap::account_sets::unblock (nano::account const & account, std: if (existing != blocking.get ().end () && (!hash || existing->dependency == *hash)) { stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::unblock); + stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::priority_unblocked); debug_assert (priorities.get ().count (account) == 0); - if (!existing->original_entry.account.is_zero ()) - { - debug_assert (existing->original_entry.account == account); - priorities.get ().insert (existing->original_entry); - } - else - { - priorities.get ().insert ({ account, account_sets::priority_initial }); - } + priorities.get ().insert ({ account, account_sets::priority_initial }); blocking.get ().erase (account); - trim_overflow (); } else diff --git a/nano/node/bootstrap/account_sets.hpp b/nano/node/bootstrap/account_sets.hpp index 0a9e5c056..8456efa3d 100644 --- a/nano/node/bootstrap/account_sets.hpp +++ b/nano/node/bootstrap/account_sets.hpp @@ -95,25 +95,16 @@ namespace bootstrap nano::account account; double priority; unsigned fails{ 0 }; - id_t id{ generate_id () }; // Uniformly distributed, used for random querying std::chrono::steady_clock::time_point timestamp{}; + id_t id{ generate_id () }; // Uniformly distributed, used for random querying }; struct blocking_entry { - priority_entry original_entry; + nano::account account; nano::block_hash dependency; nano::account dependency_account{ 0 }; id_t id{ generate_id () }; // Uniformly distributed, used for random querying - - nano::account account () const - { - return original_entry.account; - } - double priority () const - { - return original_entry.priority; - } }; // clang-format off @@ -142,7 +133,7 @@ namespace bootstrap mi::indexed_by< mi::sequenced>, mi::ordered_unique, - mi::const_mem_fun>, + mi::member>, mi::ordered_non_unique, mi::member>, mi::ordered_non_unique, diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 43dcf3f02..91dca52cd 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -5182,7 +5182,7 @@ void nano::json_handler::debug_bootstrap_priority_info () boost::property_tree::ptree response_blocking; for (auto const & entry : blocking) { - const auto account = entry.account (); + const auto account = entry.account; const auto dependency = entry.dependency; response_blocking.put (account.to_account (), dependency.to_string ());