From 2dff3d8abdddea42274c15f13195cba753b58846 Mon Sep 17 00:00:00 2001 From: Sergey Kroshnin Date: Wed, 6 Nov 2019 11:00:51 +0300 Subject: [PATCH] Prevent concurrent bootstrap populate_connections () (#2386) From run (), lazy_run () etc. if there are several runs in single bootstrap attempt --- nano/node/bootstrap/bootstrap.cpp | 14 +++++++++++--- nano/node/bootstrap/bootstrap.hpp | 2 ++ 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/nano/node/bootstrap/bootstrap.cpp b/nano/node/bootstrap/bootstrap.cpp index d8c4f5cb..68e238b0 100644 --- a/nano/node/bootstrap/bootstrap.cpp +++ b/nano/node/bootstrap/bootstrap.cpp @@ -232,7 +232,7 @@ void nano::bootstrap_attempt::run_start (nano::unique_lock & lock_a) void nano::bootstrap_attempt::run () { assert (!node->flags.disable_legacy_bootstrap); - populate_connections (); + start_populate_connections (); nano::unique_lock lock (mutex); run_start (lock); while (still_pulling ()) @@ -455,6 +455,14 @@ void nano::bootstrap_attempt::populate_connections () } } +void nano::bootstrap_attempt::start_populate_connections () +{ + if (!populate_connections_started.exchange (true)) + { + populate_connections (); + } +} + void nano::bootstrap_attempt::add_connection (nano::endpoint const & endpoint_a) { connect_client (nano::tcp_endpoint (endpoint_a.address (), endpoint_a.port ())); @@ -889,7 +897,7 @@ void nano::bootstrap_attempt::lazy_clear () void nano::bootstrap_attempt::lazy_run () { assert (!node->flags.disable_lazy_bootstrap); - populate_connections (); + 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)); nano::unique_lock lock (mutex); @@ -1242,7 +1250,7 @@ bool nano::bootstrap_attempt::wallet_finished () void nano::bootstrap_attempt::wallet_run () { assert (!node->flags.disable_wallet_bootstrap); - populate_connections (); + start_populate_connections (); auto start_time (std::chrono::steady_clock::now ()); auto max_time (std::chrono::minutes (10)); nano::unique_lock lock (mutex); diff --git a/nano/node/bootstrap/bootstrap.hpp b/nano/node/bootstrap/bootstrap.hpp index 32dffaf7..3b312592 100644 --- a/nano/node/bootstrap/bootstrap.hpp +++ b/nano/node/bootstrap/bootstrap.hpp @@ -65,6 +65,7 @@ public: std::shared_ptr connection (nano::unique_lock &); bool consume_future (std::future &); void populate_connections (); + void start_populate_connections (); bool request_frontier (nano::unique_lock &); void request_pull (nano::unique_lock &); void request_push (nano::unique_lock &); @@ -125,6 +126,7 @@ public: std::vector> bulk_push_targets; std::atomic frontiers_received{ false }; std::atomic frontiers_confirmed{ false }; + std::atomic populate_connections_started{ false }; std::atomic stopped{ false }; std::chrono::steady_clock::time_point attempt_start{ std::chrono::steady_clock::now () }; nano::bootstrap_mode mode;