From 37d9720136d9ed888b9decd62d9cc3e39da9052c Mon Sep 17 00:00:00 2001 From: Sergey Kroshnin Date: Tue, 5 Feb 2019 20:32:06 +0300 Subject: [PATCH] Request confirmation faster for new blocks (#1518) * Broadcast new blocks & request confirmation faster * Limit max broadcast_confirm_req * Minimum broadcast of 2 * sqrt or 100 peers * Disable fast broadcast with large broadcast queue * Use std:chrono for confirmation_request_delay * Formatting * Formatting * Braced initialization test * Clang formatting * Move fast broadcast to block_processor::process_receive_one * Remove extra checks * static_cast * Fix * FIx merge * Add missing declaration * Check if votes were already requested --- nano/node/blockprocessor.cpp | 24 ++++++++++++++++++++++++ nano/node/blockprocessor.hpp | 2 ++ nano/node/node.cpp | 4 ++-- 3 files changed, 28 insertions(+), 2 deletions(-) diff --git a/nano/node/blockprocessor.cpp b/nano/node/blockprocessor.cpp index 4bd5379f7..d93ade8dc 100644 --- a/nano/node/blockprocessor.cpp +++ b/nano/node/blockprocessor.cpp @@ -4,6 +4,8 @@ #include #include +std::chrono::milliseconds constexpr nano::block_processor::confirmation_request_delay; + nano::block_processor::block_processor (nano::node & node_a) : generator (node_a, nano::is_test_network ? std::chrono::milliseconds (10) : std::chrono::milliseconds (500)), stopped (false), @@ -349,6 +351,28 @@ void nano::block_processor::process_live (nano::block_hash const & hash_a, std:: // Announce our weighted vote to the network generator.add (hash_a); } + // Request confirmation for new block with delay + std::weak_ptr node_w (node.shared ()); + node.alarm.add (std::chrono::steady_clock::now () + confirmation_request_delay, [node_w, block_a]() { + if (auto node_l = node_w.lock ()) + { + // Check if votes were already requested + bool send_request (false); + { + std::lock_guard lock (node_l->active.mutex); + auto existing (node_l->active.blocks.find (block_a->hash ())); + if (existing != node_l->active.blocks.end () && !existing->second->confirmed && !existing->second->stopped && existing->second->announcements == 0) + { + send_request = true; + } + } + // Request votes + if (send_request) + { + node_l->network.broadcast_confirm_req (block_a); + } + } + }); } nano::process_return nano::block_processor::process_one (nano::transaction const & transaction_a, nano::unchecked_info info_a) diff --git a/nano/node/blockprocessor.hpp b/nano/node/blockprocessor.hpp index c498b8452..8b8221483 100644 --- a/nano/node/blockprocessor.hpp +++ b/nano/node/blockprocessor.hpp @@ -44,6 +44,8 @@ public: nano::process_return process_one (nano::transaction const &, nano::unchecked_info); nano::process_return process_one (nano::transaction const &, std::shared_ptr); nano::vote_generator generator; + // Delay required for average network propagartion before requesting confirmation + static std::chrono::milliseconds constexpr confirmation_request_delay{ 1500 }; private: void queue_unchecked (nano::transaction const &, nano::block_hash const &); diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 445ca813f..7fbc36fee 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -422,8 +422,8 @@ void nano::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.peers.total_weight () < node.config.online_weight_minimum.number ()) { - // broadcast request to all peers - list = std::make_shared> (node.peers.list_vector (100)); + // broadcast request to all peers (with max limit 2 * sqrt (peers count)) + list = std::make_shared> (node.peers.list_vector (std::min (static_cast (100), 2 * node.peers.size_sqrt ()))); } /*