Fix vote generator stopping (#4788)

This commit is contained in:
Piotr Wójcik 2024-11-22 19:59:52 +01:00 committed by GitHub
commit d843dbb364
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -76,19 +76,20 @@ bool nano::vote_generator::should_vote (transaction_variant_t const & transactio
void nano::vote_generator::start () void nano::vote_generator::start ()
{ {
debug_assert (!thread.joinable ()); debug_assert (!thread.joinable ());
thread = std::thread ([this] () { run (); }); thread = std::thread ([this] () {
nano::thread_role::set (nano::thread_role::name::voting);
run ();
});
vote_generation_queue.start (); vote_generation_queue.start ();
} }
void nano::vote_generator::stop () void nano::vote_generator::stop ()
{ {
vote_generation_queue.stop (); vote_generation_queue.stop ();
{
nano::unique_lock<nano::mutex> lock{ mutex }; nano::lock_guard<nano::mutex> lock{ mutex };
stopped = true; stopped = true;
}
lock.unlock ();
condition.notify_all (); condition.notify_all ();
if (thread.joinable ()) if (thread.joinable ())
@ -284,16 +285,22 @@ void nano::vote_generator::broadcast_action (std::shared_ptr<nano::vote> const &
void nano::vote_generator::run () void nano::vote_generator::run ()
{ {
nano::thread_role::set (nano::thread_role::name::voting);
nano::unique_lock<nano::mutex> lock{ mutex }; nano::unique_lock<nano::mutex> lock{ mutex };
while (!stopped) while (!stopped)
{ {
condition.wait_for (lock, config.vote_generator_delay, [this] () { return broadcast_predicate () || !requests.empty (); }); condition.wait_for (lock, config.vote_generator_delay, [this] () {
return stopped || broadcast_predicate () || !requests.empty ();
});
if (stopped)
{
return;
}
if (broadcast_predicate ()) if (broadcast_predicate ())
{ {
broadcast (lock); broadcast (lock);
next_broadcast = std::chrono::steady_clock::now () + std::chrono::milliseconds (config.vote_generator_delay); next_broadcast = std::chrono::steady_clock::now () + config.vote_generator_delay;
} }
if (!requests.empty ()) if (!requests.empty ())
@ -307,11 +314,13 @@ void nano::vote_generator::run ()
bool nano::vote_generator::broadcast_predicate () const bool nano::vote_generator::broadcast_predicate () const
{ {
debug_assert (!mutex.try_lock ());
if (candidates.size () >= nano::network::confirm_ack_hashes_max) if (candidates.size () >= nano::network::confirm_ack_hashes_max)
{ {
return true; return true;
} }
if (candidates.size () > 0 && std::chrono::steady_clock::now () > next_broadcast) if (!candidates.empty () && std::chrono::steady_clock::now () > next_broadcast)
{ {
return true; return true;
} }