From 5db71b292a1a31409027ef2c7aa86035d1754636 Mon Sep 17 00:00:00 2001 From: clemahieu Date: Wed, 30 Mar 2016 18:59:10 -0500 Subject: [PATCH] Add new peers to bootstrap attempt if we're already trying. --- rai/core_test/node.cpp | 8 ++++---- rai/node/bootstrap.cpp | 27 +++++++++++++++++++-------- rai/node/bootstrap.hpp | 3 ++- rai/node/node.cpp | 2 +- rai/node/testing.cpp | 2 +- 5 files changed, 27 insertions(+), 15 deletions(-) diff --git a/rai/core_test/node.cpp b/rai/core_test/node.cpp index 7130ed74..e7452920 100644 --- a/rai/core_test/node.cpp +++ b/rai/core_test/node.cpp @@ -205,11 +205,11 @@ TEST (node, auto_bootstrap) node1->network.send_keepalive (system.nodes [0]->network.endpoint ()); node1->start (); ASSERT_EQ (0, node1->bootstrap_initiator.warmed_up); - ASSERT_FALSE (node1->bootstrap_initiator.in_progress); + ASSERT_FALSE (node1->bootstrap_initiator.in_progress ()); ASSERT_EQ (0, system.nodes [0]->bootstrap_initiator.warmed_up); - ASSERT_FALSE (system.nodes [0]->bootstrap_initiator.in_progress); + ASSERT_FALSE (system.nodes [0]->bootstrap_initiator.in_progress ()); auto iterations2 (0); - while (!node1->bootstrap_initiator.in_progress || !system.nodes [0]->bootstrap_initiator.in_progress) + while (!node1->bootstrap_initiator.in_progress () || !system.nodes [0]->bootstrap_initiator.in_progress ()) { system.poll (); ++iterations2; @@ -225,7 +225,7 @@ TEST (node, auto_bootstrap) ASSERT_LT (iterations3, 200); } auto iterations4 (0); - while (node1->bootstrap_initiator.in_progress || system.nodes [0]->bootstrap_initiator.in_progress) + while (node1->bootstrap_initiator.in_progress () || system.nodes [0]->bootstrap_initiator.in_progress ()) { system.poll (); ++iterations4; diff --git a/rai/node/bootstrap.cpp b/rai/node/bootstrap.cpp index babc62b2..e98f5659 100644 --- a/rai/node/bootstrap.cpp +++ b/rai/node/bootstrap.cpp @@ -778,12 +778,12 @@ connected (false) rai::bootstrap_attempt::~bootstrap_attempt () { std::lock_guard lock (node->bootstrap_initiator.mutex); - node->bootstrap_initiator.in_progress = false; node->bootstrap_initiator.notify_listeners (); } void rai::bootstrap_attempt::attempt () { + assert (!node->bootstrap_initiator.mutex.try_lock ()); if (!peers.empty () && !connected) { rai::endpoint endpoint (peers.back ()); @@ -793,8 +793,9 @@ void rai::bootstrap_attempt::attempt () auto this_l (shared_from_this ()); auto processor (std::make_shared (node_l, this_l)); processor->run (rai::tcp_endpoint (endpoint.address (), endpoint.port ())); - node->alarm.add (std::chrono::system_clock::now () + std::chrono::milliseconds (150), [this_l] () + node->alarm.add (std::chrono::system_clock::now () + std::chrono::milliseconds (250), [this_l] () { + std::lock_guard lock (this_l->node->bootstrap_initiator.mutex); this_l->attempt (); }); } @@ -802,21 +803,26 @@ void rai::bootstrap_attempt::attempt () rai::bootstrap_initiator::bootstrap_initiator (rai::node & node_a) : node (node_a), -in_progress (false), warmed_up (false) { } -void rai::bootstrap_initiator::warmup (rai::endpoint const &) +void rai::bootstrap_initiator::warmup (rai::endpoint const & endpoint_a) { auto do_warmup (false); { std::lock_guard lock (mutex); - if (!in_progress && warmed_up < 3) + auto attempt_l (attempt.lock ()); + if (attempt_l == nullptr && warmed_up < 3) { ++warmed_up; do_warmup = true; } + else + { + attempt_l->peers.push_back (endpoint_a); + attempt_l->attempt (); + } } if (do_warmup) { @@ -846,9 +852,9 @@ void rai::bootstrap_initiator::bootstrap_any () void rai::bootstrap_initiator::begin_attempt (std::shared_ptr attempt_a) { std::lock_guard lock (mutex); - if (!in_progress) + if (!in_progress ()) { - in_progress = true; + attempt = attempt_a; attempt_a->attempt (); notify_listeners (); } @@ -860,12 +866,17 @@ void rai::bootstrap_initiator::add_observer (std::function const & observers.push_back (observer_a); } +bool rai::bootstrap_initiator::in_progress () +{ + return attempt.lock () != nullptr; +} + void rai::bootstrap_initiator::notify_listeners () { assert (!mutex.try_lock()); for (auto & i: observers) { - i (in_progress); + i (in_progress ()); } } diff --git a/rai/node/bootstrap.hpp b/rai/node/bootstrap.hpp index f094877b..04861126 100644 --- a/rai/node/bootstrap.hpp +++ b/rai/node/bootstrap.hpp @@ -126,9 +126,10 @@ public: void begin_attempt (std::shared_ptr ); void notify_listeners (); void add_observer (std::function const &); + bool in_progress (); std::mutex mutex; rai::node & node; - bool in_progress; + std::weak_ptr attempt; unsigned warmed_up; private: std::vector > observers; diff --git a/rai/node/node.cpp b/rai/node/node.cpp index fdfdd0e1..bc131890 100644 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -1965,7 +1965,7 @@ bool rai::peer_container::insert (rai::endpoint const & endpoint_a, rai::block_h unknown = true; } } - if (unknown) + if (unknown && !result) { peer_observer (endpoint_a); } diff --git a/rai/node/testing.cpp b/rai/node/testing.cpp index 68bce955..dd6ae7f4 100644 --- a/rai/node/testing.cpp +++ b/rai/node/testing.cpp @@ -34,7 +34,7 @@ alarm (*service) } while (new1 == starting1 || new2 == starting2); } auto iterations1 (0); - while (std::any_of (nodes.begin (), nodes.end (), [] (std::shared_ptr const & node_a) {return node_a->bootstrap_initiator.in_progress;})) + while (std::any_of (nodes.begin (), nodes.end (), [] (std::shared_ptr const & node_a) {return node_a->bootstrap_initiator.in_progress ();})) { poll (); ++iterations1;