Reinsert unblocked with default priority

This commit is contained in:
Piotr Wójcik 2024-11-12 13:33:01 +01:00
commit 694d975fe2
5 changed files with 27 additions and 39 deletions

View file

@ -55,6 +55,7 @@ TEST (account_sets, block)
nano::account account{ 1 }; nano::account account{ 1 };
nano::account_sets_config config; nano::account_sets_config config;
nano::bootstrap::account_sets sets{ config, system.stats }; nano::bootstrap::account_sets sets{ config, system.stats };
sets.priority_up (account);
sets.block (account, random_hash ()); sets.block (account, random_hash ());
ASSERT_TRUE (sets.blocked (account)); ASSERT_TRUE (sets.blocked (account));
} }
@ -67,7 +68,9 @@ TEST (account_sets, unblock)
nano::account_sets_config config; nano::account_sets_config config;
nano::bootstrap::account_sets sets{ config, system.stats }; nano::bootstrap::account_sets sets{ config, system.stats };
auto hash = random_hash (); auto hash = random_hash ();
sets.priority_up (account);
sets.block (account, hash); sets.block (account, hash);
ASSERT_TRUE (sets.blocked (account));
sets.unblock (account, hash); sets.unblock (account, hash);
ASSERT_FALSE (sets.blocked (account)); ASSERT_FALSE (sets.blocked (account));
} }
@ -93,8 +96,7 @@ TEST (account_sets, priority_blocked)
ASSERT_EQ (0.0, sets.priority (account)); ASSERT_EQ (0.0, sets.priority (account));
} }
// When account is unblocked, check that it retains it former priority TEST (account_sets, priority_unblock)
TEST (account_sets, priority_unblock_keep)
{ {
nano::test::system system; nano::test::system system;
@ -102,13 +104,12 @@ TEST (account_sets, priority_unblock_keep)
nano::account_sets_config config; nano::account_sets_config config;
nano::bootstrap::account_sets sets{ config, system.stats }; nano::bootstrap::account_sets sets{ config, system.stats };
sets.priority_up (account); sets.priority_up (account);
sets.priority_up (account); ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial);
ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial + nano::bootstrap::account_sets::priority_increase);
auto hash = random_hash (); auto hash = random_hash ();
sets.block (account, hash); sets.block (account, hash);
ASSERT_EQ (0.0, sets.priority (account)); ASSERT_EQ (0.0, sets.priority (account));
sets.unblock (account, hash); 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) TEST (account_sets, priority_up_down)

View file

@ -467,6 +467,7 @@ enum class detail
prioritize, prioritize,
prioritize_failed, prioritize_failed,
block, block,
block_failed,
unblock, unblock,
unblock_failed, unblock_failed,
dependency_update, dependency_update,
@ -490,6 +491,7 @@ enum class detail
blocking_overflow, blocking_overflow,
priority_insert, priority_insert,
priority_set, priority_set,
priority_unblocked,
erase_by_threshold, erase_by_threshold,
erase_by_blocking, erase_by_blocking,
priority_overflow, priority_overflow,

View file

@ -105,19 +105,21 @@ void nano::bootstrap::account_sets::block (nano::account const & account, nano::
{ {
debug_assert (!account.is_zero ()); debug_assert (!account.is_zero ());
auto erased = priorities.get<tag_account> ().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); stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::block);
auto existing = priorities.get<tag_account> ().find (account); debug_assert (blocking.get<tag_account> ().count (account) == 0);
auto entry = (existing == priorities.get<tag_account> ().end ()) ? priority_entry{ account, 0 } : *existing; blocking.get<tag_account> ().insert ({ account, dependency });
priorities.get<tag_account> ().erase (account);
stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::erase_by_blocking);
blocking.get<tag_account> ().insert ({ entry, dependency });
stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::blocking_insert);
trim_overflow (); 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<nano::block_hash> const & hash) void nano::bootstrap::account_sets::unblock (nano::account const & account, std::optional<nano::block_hash> const & hash)
{ {
@ -131,19 +133,11 @@ void nano::bootstrap::account_sets::unblock (nano::account const & account, std:
if (existing != blocking.get<tag_account> ().end () && (!hash || existing->dependency == *hash)) if (existing != blocking.get<tag_account> ().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::unblock);
stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::priority_unblocked);
debug_assert (priorities.get<tag_account> ().count (account) == 0); debug_assert (priorities.get<tag_account> ().count (account) == 0);
if (!existing->original_entry.account.is_zero ())
{
debug_assert (existing->original_entry.account == account);
priorities.get<tag_account> ().insert (existing->original_entry);
}
else
{
priorities.get<tag_account> ().insert ({ account, account_sets::priority_initial }); priorities.get<tag_account> ().insert ({ account, account_sets::priority_initial });
}
blocking.get<tag_account> ().erase (account); blocking.get<tag_account> ().erase (account);
trim_overflow (); trim_overflow ();
} }
else else

View file

@ -95,25 +95,16 @@ namespace bootstrap
nano::account account; nano::account account;
double priority; double priority;
unsigned fails{ 0 }; unsigned fails{ 0 };
id_t id{ generate_id () }; // Uniformly distributed, used for random querying
std::chrono::steady_clock::time_point timestamp{}; std::chrono::steady_clock::time_point timestamp{};
id_t id{ generate_id () }; // Uniformly distributed, used for random querying
}; };
struct blocking_entry struct blocking_entry
{ {
priority_entry original_entry; nano::account account;
nano::block_hash dependency; nano::block_hash dependency;
nano::account dependency_account{ 0 }; nano::account dependency_account{ 0 };
id_t id{ generate_id () }; // Uniformly distributed, used for random querying 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 // clang-format off
@ -142,7 +133,7 @@ namespace bootstrap
mi::indexed_by< mi::indexed_by<
mi::sequenced<mi::tag<tag_sequenced>>, mi::sequenced<mi::tag<tag_sequenced>>,
mi::ordered_unique<mi::tag<tag_account>, mi::ordered_unique<mi::tag<tag_account>,
mi::const_mem_fun<blocking_entry, nano::account, &blocking_entry::account>>, mi::member<blocking_entry, nano::account, &blocking_entry::account>>,
mi::ordered_non_unique<mi::tag<tag_dependency>, mi::ordered_non_unique<mi::tag<tag_dependency>,
mi::member<blocking_entry, nano::block_hash, &blocking_entry::dependency>>, mi::member<blocking_entry, nano::block_hash, &blocking_entry::dependency>>,
mi::ordered_non_unique<mi::tag<tag_dependency_account>, mi::ordered_non_unique<mi::tag<tag_dependency_account>,

View file

@ -5182,7 +5182,7 @@ void nano::json_handler::debug_bootstrap_priority_info ()
boost::property_tree::ptree response_blocking; boost::property_tree::ptree response_blocking;
for (auto const & entry : blocking) for (auto const & entry : blocking)
{ {
const auto account = entry.account (); const auto account = entry.account;
const auto dependency = entry.dependency; const auto dependency = entry.dependency;
response_blocking.put (account.to_account (), dependency.to_string ()); response_blocking.put (account.to_account (), dependency.to_string ());