From 738ed67dfab1ef0d459ec529e526e70464e76be3 Mon Sep 17 00:00:00 2001 From: SergiySW Date: Sat, 30 Jun 2018 02:22:34 +0300 Subject: [PATCH] Confirm req to all peers if reps list is empty (#937) or online stake is less than required quorum --- rai/node/node.cpp | 24 +++++++++++++++++++++++- rai/node/node.hpp | 1 + 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 1b6002ed62..c7c9464d51 100644 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -264,6 +264,11 @@ void rai::network::republish_vote (std::shared_ptr vote_a) void rai::network::broadcast_confirm_req (std::shared_ptr block_a) { auto list (std::make_shared> (node.peers.representatives (std::numeric_limits::max ()))); + if (list->empty () || node.online_reps.online_stake () == node.config.online_weight_minimum.number ()) + { + // broadcast request to all peers + list = std::make_shared> (node.peers.list_vector ()); + } broadcast_confirm_req_base (block_a, list, 0); } @@ -1990,6 +1995,18 @@ std::map rai::peer_container::list_version () return result; } +std::vector rai::peer_container::list_vector () +{ + std::vector result; + std::lock_guard 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> (*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> (node.peers.list_vector ()), 0); + } } } roots.modify (i, [](rai::conflict_info & info_a) { diff --git a/rai/node/node.hpp b/rai/node/node.hpp index 50a8e75e31..cd43d05556 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -219,6 +219,7 @@ class peer_container // List of all peers std::deque list (); std::map list_version (); + std::vector list_vector (); // A list of random peers sized for the configured rebroadcast fanout std::deque list_fanout (); // Get the next peer for attempting bootstrap