diff --git a/nano/node/vote_generator.cpp b/nano/node/vote_generator.cpp index 00dccfd5..a54ec136 100644 --- a/nano/node/vote_generator.cpp +++ b/nano/node/vote_generator.cpp @@ -289,11 +289,12 @@ void nano::vote_generator::run () nano::unique_lock lock{ mutex }; while (!stopped) { - condition.wait_for (lock, config.vote_generator_delay, [this] () { return this->candidates.size () >= nano::network::confirm_ack_hashes_max || !requests.empty (); }); + condition.wait_for (lock, config.vote_generator_delay, [this] () { return broadcast_predicate () || !requests.empty (); }); - if (!candidates.empty ()) + if (broadcast_predicate ()) { broadcast (lock); + next_broadcast = std::chrono::steady_clock::now () + std::chrono::milliseconds (config.vote_generator_delay); } if (!requests.empty ()) @@ -305,6 +306,19 @@ void nano::vote_generator::run () } } +bool nano::vote_generator::broadcast_predicate () const +{ + if (candidates.size () >= nano::network::confirm_ack_hashes_max) + { + return true; + } + if (candidates.size () > 0 && std::chrono::steady_clock::now () > next_broadcast) + { + return true; + } + return false; +} + nano::container_info nano::vote_generator::container_info () const { nano::lock_guard guard{ mutex }; diff --git a/nano/node/vote_generator.hpp b/nano/node/vote_generator.hpp index c93317bc..76fc0c58 100644 --- a/nano/node/vote_generator.hpp +++ b/nano/node/vote_generator.hpp @@ -30,6 +30,7 @@ private: using candidate_t = std::pair; using request_t = std::pair, std::shared_ptr>; using queue_entry_t = std::pair; + std::chrono::steady_clock::time_point next_broadcast = { std::chrono::steady_clock::now () }; public: vote_generator (nano::node_config const &, nano::node &, nano::ledger &, nano::wallets &, nano::vote_processor &, nano::local_vote_history &, nano::network &, nano::stats &, nano::logger &, bool is_final); @@ -56,6 +57,7 @@ private: void broadcast_action (std::shared_ptr const &) const; void process_batch (std::deque & batch); bool should_vote (transaction_variant_t const &, nano::root const &, nano::block_hash const &) const; + bool broadcast_predicate () const; private: std::function const &, std::shared_ptr &)> reply_action; // must be set only during initialization by using set_reply_action