Confirm req to all peers if reps list is empty (#937)

or online stake is less than required quorum
This commit is contained in:
SergiySW 2018-06-30 02:22:34 +03:00 committed by Russel Waters
commit 738ed67dfa
2 changed files with 24 additions and 1 deletions

View file

@ -264,6 +264,11 @@ void rai::network::republish_vote (std::shared_ptr<rai::vote> vote_a)
void rai::network::broadcast_confirm_req (std::shared_ptr<rai::block> block_a)
{
auto list (std::make_shared<std::vector<rai::peer_information>> (node.peers.representatives (std::numeric_limits<size_t>::max ())));
if (list->empty () || node.online_reps.online_stake () == node.config.online_weight_minimum.number ())
{
// broadcast request to all peers
list = std::make_shared<std::vector<rai::peer_information>> (node.peers.list_vector ());
}
broadcast_confirm_req_base (block_a, list, 0);
}
@ -1990,6 +1995,18 @@ std::map<rai::endpoint, unsigned> rai::peer_container::list_version ()
return result;
}
std::vector<rai::peer_information> rai::peer_container::list_vector ()
{
std::vector<peer_information> result;
std::lock_guard<std::mutex> lock (mutex);
for (auto i (peers.begin ()), j (peers.end ()); i != j; ++i)
{
result.push_back (*i);
}
std::random_shuffle (result.begin (), result.end ());
return result;
}
rai::endpoint rai::peer_container::bootstrap_peer ()
{
rai::endpoint result (boost::asio::ip::address_v6::any (), 0);
@ -3551,7 +3568,7 @@ void rai::active_transactions::announce_votes ()
}
}
}
if (!reps->empty ())
if (!reps->empty () && node.online_reps.online_stake () != node.config.online_weight_minimum.number ())
{
// broadcast_confirm_req_base modifies reps, so we clone it once to avoid aliasing
node.network.broadcast_confirm_req_base (i->confirm_req_options.first, std::make_shared<std::vector<rai::peer_information>> (*reps), 0);
@ -3560,6 +3577,11 @@ void rai::active_transactions::announce_votes ()
node.network.broadcast_confirm_req_base (i->confirm_req_options.second, reps, 0);
}
}
else
{
// broadcast request to all peers
node.network.broadcast_confirm_req_base (i->confirm_req_options.first, std::make_shared<std::vector<rai::peer_information>> (node.peers.list_vector ()), 0);
}
}
}
roots.modify (i, [](rai::conflict_info & info_a) {

View file

@ -219,6 +219,7 @@ public:
// List of all peers
std::deque<rai::endpoint> list ();
std::map<rai::endpoint, unsigned> list_version ();
std::vector<peer_information> list_vector ();
// A list of random peers sized for the configured rebroadcast fanout
std::deque<rai::endpoint> list_fanout ();
// Get the next peer for attempting bootstrap