Add new peers to bootstrap attempt if we're already trying.

This commit is contained in:
clemahieu 2016-03-30 18:59:10 -05:00
commit 5db71b292a
5 changed files with 27 additions and 15 deletions

View file

@ -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;

View file

@ -778,12 +778,12 @@ connected (false)
rai::bootstrap_attempt::~bootstrap_attempt ()
{
std::lock_guard <std::mutex> 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 <rai::bootstrap_client> (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 <std::mutex> 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 <std::mutex> 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 <rai::bootstrap_attempt> attempt_a)
{
std::lock_guard <std::mutex> 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 <void (bool)> 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 ());
}
}

View file

@ -126,9 +126,10 @@ public:
void begin_attempt (std::shared_ptr <rai::bootstrap_attempt>);
void notify_listeners ();
void add_observer (std::function <void (bool)> const &);
bool in_progress ();
std::mutex mutex;
rai::node & node;
bool in_progress;
std::weak_ptr <rai::bootstrap_attempt> attempt;
unsigned warmed_up;
private:
std::vector <std::function <void (bool)>> observers;

View file

@ -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);
}

View file

@ -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 <rai::node> const & node_a) {return node_a->bootstrap_initiator.in_progress;}))
while (std::any_of (nodes.begin (), nodes.end (), [] (std::shared_ptr <rai::node> const & node_a) {return node_a->bootstrap_initiator.in_progress ();}))
{
poll ();
++iterations1;