Limit bulk pulls memory usage in lazy bootstrap

flush less pulls from lazy_pulls to pulls
This commit is contained in:
Sergey Kroshnin 2019-11-06 22:59:08 +03:00
commit ca6e4f171d

View file

@ -819,6 +819,9 @@ void nano::bootstrap_attempt::lazy_requeue (nano::block_hash const & hash_a, nan
void nano::bootstrap_attempt::lazy_pull_flush () void nano::bootstrap_attempt::lazy_pull_flush ()
{ {
assert (!mutex.try_lock ()); assert (!mutex.try_lock ());
static size_t const max_pulls (nano::bootstrap_limits::bootstrap_connection_scale_target_blocks_lazy * 3);
if (pulls.size () < max_pulls)
{
last_lazy_flush = std::chrono::steady_clock::now (); last_lazy_flush = std::chrono::steady_clock::now ();
nano::lock_guard<std::mutex> lazy_lock (lazy_mutex); nano::lock_guard<std::mutex> lazy_lock (lazy_mutex);
assert (node->network_params.bootstrap.lazy_max_pull_blocks <= std::numeric_limits<nano::pull_info::count_t>::max ()); assert (node->network_params.bootstrap.lazy_max_pull_blocks <= std::numeric_limits<nano::pull_info::count_t>::max ());
@ -836,16 +839,20 @@ void nano::bootstrap_attempt::lazy_pull_flush ()
batch_count = std::max (node->network_params.bootstrap.lazy_min_pull_blocks, batch_count_min); batch_count = std::max (node->network_params.bootstrap.lazy_min_pull_blocks, batch_count_min);
} }
} }
size_t count (0);
auto transaction (node->store.tx_begin_read ()); auto transaction (node->store.tx_begin_read ());
for (auto & pull_start : lazy_pulls) while (!lazy_pulls.empty () && count < max_pulls)
{ {
auto const & pull_start (lazy_pulls.front ());
// Recheck if block was already processed // Recheck if block was already processed
if (lazy_blocks.find (pull_start.first) == lazy_blocks.end () && !node->store.block_exists (transaction, pull_start.first)) if (lazy_blocks.find (pull_start.first) == lazy_blocks.end () && !node->store.block_exists (transaction, pull_start.first))
{ {
pulls.emplace_back (pull_start.first, pull_start.first, nano::block_hash (0), batch_count, pull_start.second); pulls.emplace_back (pull_start.first, pull_start.first, nano::block_hash (0), batch_count, pull_start.second);
++count;
}
lazy_pulls.pop_front ();
} }
} }
lazy_pulls.clear ();
} }
bool nano::bootstrap_attempt::lazy_finished () bool nano::bootstrap_attempt::lazy_finished ()