From 52dee5ee91d64f06bb00c4fff6e3a52b0430054e Mon Sep 17 00:00:00 2001 From: Sergey Kroshnin Date: Wed, 6 Nov 2019 23:01:44 +0300 Subject: [PATCH] Limit max lazy bootstrap blocks size if legacy bootstrap is enabled 1M lazy blocks limit --- nano/node/bootstrap/bootstrap.cpp | 26 ++++++++++++++++++++++---- nano/node/bootstrap/bootstrap.hpp | 4 ++++ 2 files changed, 26 insertions(+), 4 deletions(-) diff --git a/nano/node/bootstrap/bootstrap.cpp b/nano/node/bootstrap/bootstrap.cpp index 9df1f7392..be333fe5f 100644 --- a/nano/node/bootstrap/bootstrap.cpp +++ b/nano/node/bootstrap/bootstrap.cpp @@ -25,6 +25,7 @@ constexpr std::chrono::seconds nano::bootstrap_limits::lazy_flush_delay_sec; constexpr unsigned nano::bootstrap_limits::lazy_destinations_request_limit; constexpr uint64_t nano::bootstrap_limits::lazy_batch_pull_count_resize_blocks_limit; constexpr double nano::bootstrap_limits::lazy_batch_pull_count_resize_ratio; +constexpr size_t nano::bootstrap_limits::lazy_blocks_restart_limit; constexpr std::chrono::hours nano::bootstrap_excluded_peers::exclude_time_hours; constexpr std::chrono::hours nano::bootstrap_excluded_peers::exclude_remove_hours; @@ -890,10 +891,27 @@ bool nano::bootstrap_attempt::lazy_finished () return result; } +bool nano::bootstrap_attempt::lazy_has_expired () const +{ + bool result (false); + // Max 30 minutes run with enabled legacy bootstrap + static std::chrono::minutes const max_lazy_time (node->flags.disable_legacy_bootstrap ? 7 * 24 * 60 : 30); + if (std::chrono::steady_clock::now () - lazy_start_time >= max_lazy_time) + { + result = true; + } + else if (!node->flags.disable_legacy_bootstrap && lazy_blocks_count > nano::bootstrap_limits::lazy_blocks_restart_limit) + { + result = true; + } + return result; +} + void nano::bootstrap_attempt::lazy_clear () { assert (!lazy_mutex.try_lock ()); lazy_blocks.clear (); + lazy_blocks_count = 0; lazy_keys.clear (); lazy_pulls.clear (); lazy_state_backlog.clear (); @@ -905,13 +923,12 @@ void nano::bootstrap_attempt::lazy_run () { assert (!node->flags.disable_lazy_bootstrap); start_populate_connections (); - auto start_time (std::chrono::steady_clock::now ()); - auto max_time (std::chrono::minutes (node->flags.disable_legacy_bootstrap ? 7 * 24 * 60 : 30)); + lazy_start_time = std::chrono::steady_clock::now (); nano::unique_lock lock (mutex); - while ((still_pulling () || !lazy_finished ()) && std::chrono::steady_clock::now () - start_time < max_time) + while ((still_pulling () || !lazy_finished ()) && !lazy_has_expired ()) { unsigned iterations (0); - while (still_pulling () && std::chrono::steady_clock::now () - start_time < max_time) + while (still_pulling () && !lazy_has_expired ()) { if (!pulls.empty ()) { @@ -1030,6 +1047,7 @@ bool nano::bootstrap_attempt::process_block_lazy (std::shared_ptr b } } lazy_blocks.insert (hash); + ++lazy_blocks_count; // Adding lazy balances for first processed block in pull if (pull_blocks == 0 && (block_a->type () == nano::block_type::state || block_a->type () == nano::block_type::send)) { diff --git a/nano/node/bootstrap/bootstrap.hpp b/nano/node/bootstrap/bootstrap.hpp index 3b3125929..459def3d6 100644 --- a/nano/node/bootstrap/bootstrap.hpp +++ b/nano/node/bootstrap/bootstrap.hpp @@ -89,6 +89,7 @@ public: void lazy_add (nano::hash_or_account const &, unsigned = std::numeric_limits::max ()); void lazy_requeue (nano::block_hash const &, nano::block_hash const &, bool); bool lazy_finished (); + bool lazy_has_expired () const; void lazy_pull_flush (); void lazy_clear (); bool process_block_lazy (std::shared_ptr, nano::account const &, uint64_t, nano::bulk_pull::count_t, unsigned); @@ -139,6 +140,7 @@ public: std::unordered_map lazy_balances; std::unordered_set lazy_keys; std::deque> lazy_pulls; + std::chrono::steady_clock::time_point lazy_start_time; std::chrono::steady_clock::time_point last_lazy_flush{ std::chrono::steady_clock::now () }; class account_tag { @@ -152,6 +154,7 @@ public: boost::multi_index::ordered_non_unique, boost::multi_index::member, std::greater>, boost::multi_index::hashed_unique, boost::multi_index::member>>> lazy_destinations; + std::atomic lazy_blocks_count{ 0 }; std::atomic lazy_destinations_flushed{ false }; std::mutex lazy_mutex; // Wallet lazy bootstrap @@ -284,5 +287,6 @@ public: static constexpr unsigned lazy_destinations_request_limit = 256 * 1024; static constexpr uint64_t lazy_batch_pull_count_resize_blocks_limit = 4 * 1024 * 1024; static constexpr double lazy_batch_pull_count_resize_ratio = 2.0; + static constexpr size_t lazy_blocks_restart_limit = 1024 * 1024; }; }