Add new peers to bootstrap attempt if we're already trying.
This commit is contained in:
parent
20ad514d34
commit
5db71b292a
5 changed files with 27 additions and 15 deletions
|
@ -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;
|
||||
|
|
|
@ -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 ());
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue