diff --git a/nano/core_test/bootstrap.cpp b/nano/core_test/bootstrap.cpp index 78557b58f..2c13390a1 100644 --- a/nano/core_test/bootstrap.cpp +++ b/nano/core_test/bootstrap.cpp @@ -27,11 +27,13 @@ nano::block_hash random_hash () } } +/* + * account_sets + */ + TEST (account_sets, construction) { nano::test::system system; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; } @@ -41,8 +43,6 @@ TEST (account_sets, empty_blocked) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; ASSERT_FALSE (sets.blocked (account)); @@ -53,8 +53,6 @@ TEST (account_sets, block) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; sets.block (account, random_hash ()); @@ -66,8 +64,6 @@ TEST (account_sets, unblock) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; auto hash = random_hash (); @@ -81,8 +77,6 @@ TEST (account_sets, priority_base) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; ASSERT_EQ (0.0, sets.priority (account)); @@ -93,8 +87,6 @@ TEST (account_sets, priority_blocked) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; sets.block (account, random_hash ()); @@ -107,8 +99,6 @@ TEST (account_sets, priority_unblock_keep) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; sets.priority_up (account); @@ -126,37 +116,58 @@ TEST (account_sets, priority_up_down) nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; sets.priority_up (account); ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial); sets.priority_down (account); - ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial / nano::bootstrap::account_sets::priority_divide); + ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial); } -TEST (account_sets, priority_down_sat) +TEST (account_sets, priority_down_empty) { nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; sets.priority_down (account); ASSERT_EQ (0.0, sets.priority (account)); } +TEST (account_sets, priority_down_saturate) +{ + nano::test::system system; + + nano::account account{ 1 }; + nano::account_sets_config config; + nano::bootstrap::account_sets sets{ config, system.stats }; + sets.priority_up (account); + ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_initial); + for (int n = 0; n < 1000; ++n) + { + sets.priority_down (account); + } + ASSERT_FALSE (sets.prioritized (account)); +} + +TEST (account_sets, priority_set) +{ + nano::test::system system; + + nano::account account{ 1 }; + nano::account_sets_config config; + nano::bootstrap::account_sets sets{ config, system.stats }; + sets.priority_set (account, 10.0); + ASSERT_EQ (sets.priority (account), 10.0); +} + // Ensure priority value is bounded TEST (account_sets, saturate_priority) { nano::test::system system; nano::account account{ 1 }; - auto store = nano::make_store (system.logger, nano::unique_path (), nano::dev::constants); - ASSERT_FALSE (store->init_error ()); nano::account_sets_config config; nano::bootstrap::account_sets sets{ config, system.stats }; for (int n = 0; n < 1000; ++n) @@ -166,6 +177,10 @@ TEST (account_sets, saturate_priority) ASSERT_EQ (sets.priority (account), nano::bootstrap::account_sets::priority_max); } +/* + * bootstrap + */ + /** * Tests the base case for returning */ diff --git a/nano/node/bootstrap/account_sets.cpp b/nano/node/bootstrap/account_sets.cpp index 39857cead..3564f4167 100644 --- a/nano/node/bootstrap/account_sets.cpp +++ b/nano/node/bootstrap/account_sets.cpp @@ -30,11 +30,11 @@ void nano::bootstrap::account_sets::priority_up (nano::account const & account) { stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::prioritize); - auto iter = priorities.get ().find (account); - if (iter != priorities.get ().end ()) + if (auto it = priorities.get ().find (account); it != priorities.get ().end ()) { - priorities.get ().modify (iter, [] (auto & val) { + priorities.get ().modify (it, [] (auto & val) { val.priority = std::min ((val.priority + account_sets::priority_increase), account_sets::priority_max); + val.fails = 0; }); } else @@ -57,21 +57,19 @@ void nano::bootstrap::account_sets::priority_down (nano::account const & account return; } - auto iter = priorities.get ().find (account); - if (iter != priorities.get ().end ()) + if (auto it = priorities.get ().find (account); it != priorities.get ().end ()) { stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::deprioritize); - auto priority_new = iter->priority / account_sets::priority_divide; - if (priority_new <= account_sets::priority_cutoff) + if (it->fails >= account_sets::max_fails || it->fails >= it->priority) { stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::erase_by_threshold); - priorities.get ().erase (iter); + priorities.get ().erase (it); } else { - priorities.get ().modify (iter, [priority_new] (auto & val) { - val.priority = priority_new; + priorities.get ().modify (it, [] (auto & val) { + val.fails += 1; }); } } @@ -90,8 +88,7 @@ void nano::bootstrap::account_sets::priority_set (nano::account const & account, if (!blocked (account)) { - auto iter = priorities.get ().find (account); - if (iter == priorities.get ().end ()) + if (!priorities.get ().contains (account)) { stats.inc (nano::stat::type::bootstrap_account_sets, nano::stat::detail::priority_set); priorities.get ().insert ({ account, priority }); @@ -332,8 +329,7 @@ double nano::bootstrap::account_sets::priority (nano::account const & account) c { if (!blocked (account)) { - auto existing = priorities.get ().find (account); - if (existing != priorities.get ().end ()) + if (auto existing = priorities.get ().find (account); existing != priorities.get ().end ()) { return existing->priority; } diff --git a/nano/node/bootstrap/account_sets.hpp b/nano/node/bootstrap/account_sets.hpp index 9e04885c4..061da0fe5 100644 --- a/nano/node/bootstrap/account_sets.hpp +++ b/nano/node/bootstrap/account_sets.hpp @@ -30,6 +30,7 @@ namespace bootstrap static double constexpr priority_divide = 2.0; static double constexpr priority_max = 128.0; static double constexpr priority_cutoff = 0.15; + static unsigned constexpr max_fails = 2; public: account_sets (account_sets_config const &, nano::stats &); @@ -93,7 +94,7 @@ 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{}; }; @@ -103,7 +104,6 @@ namespace bootstrap priority_entry original_entry; nano::block_hash dependency; nano::account dependency_account{ 0 }; - id_t id{ generate_id () }; // Uniformly distributed, used for random querying nano::account account () const