From 0f1960d3b79b655c3e0ca5491dac284c071b338b Mon Sep 17 00:00:00 2001 From: gr0vity Date: Tue, 3 Dec 2024 15:30:53 +0100 Subject: [PATCH] extend election status with vote_broadcast_count and adjust testcase --- nano/core_test/election_scheduler.cpp | 5 ++--- nano/node/election.cpp | 6 +++++- nano/node/election.hpp | 1 + nano/node/election_status.hpp | 1 + nano/node/json_handler.cpp | 2 +- 5 files changed, 10 insertions(+), 5 deletions(-) diff --git a/nano/core_test/election_scheduler.cpp b/nano/core_test/election_scheduler.cpp index 5f6a147e9..21af2c6a7 100644 --- a/nano/core_test/election_scheduler.cpp +++ b/nano/core_test/election_scheduler.cpp @@ -193,20 +193,19 @@ TEST (election_scheduler, transition_optimistic_to_priority) ASSERT_TIMELY (5s, node.vote_router.active (block->hash ())); auto election = node.active.election (block->qualified_root ()); ASSERT_EQ (election->behavior (), nano::election_behavior::optimistic); + ASSERT_TIMELY_EQ (1s, 1, election->current_status ().status.vote_broadcast_count); // Confirm first block to allow upgrading second block's election nano::test::confirm (node.ledger, blocks.at (howmany_blocks - 1)); // Attempt to start priority election for second block - node.stats.clear (); - ASSERT_EQ (0, node.stats.count (nano::stat::type::election, nano::stat::detail::broadcast_vote)); node.active.insert (block, nano::election_behavior::priority); // Verify priority transition ASSERT_EQ (election->behavior (), nano::election_behavior::priority); ASSERT_EQ (1, node.stats.count (nano::stat::type::active_elections, nano::stat::detail::transition_priority)); // Verify vote broadcast after transitioning - ASSERT_TIMELY_EQ (1s, 1, node.stats.count (nano::stat::type::election, nano::stat::detail::broadcast_vote)); + ASSERT_TIMELY_EQ (1s, 2, election->current_status ().status.vote_broadcast_count); ASSERT_TRUE (node.active.active (*block)); } diff --git a/nano/node/election.cpp b/nano/node/election.cpp index fc3a33dc2..c42b55b77 100644 --- a/nano/node/election.cpp +++ b/nano/node/election.cpp @@ -27,7 +27,7 @@ nano::election::election (nano::node & node_a, std::shared_ptr cons live_vote_action (live_vote_action_a), node (node_a), behavior_m (election_behavior_a), - status ({ block_a, 0, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, 1, 0, nano::election_status_type::ongoing }), + status ({ block_a, 0, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, 0, 1, 0, nano::election_status_type::ongoing }), height (block_a->sideband ().height), root (block_a->root ()), qualified_root (block_a->qualified_root ()) @@ -440,6 +440,7 @@ void nano::election::confirm_if_quorum (nano::unique_lock & lock_a) { if (!is_quorum.exchange (true) && node.config.enable_voting && node.wallets.reps ().voting > 0) { + ++vote_broadcast_count; node.final_generator.add (root, status.winner->hash ()); } if (final_weight >= node.online_reps.delta ()) @@ -596,6 +597,7 @@ nano::election_extended_status nano::election::current_status_locked () const nano::election_status status_l = status; status_l.confirmation_request_count = confirmation_request_count; + status_l.vote_broadcast_count = vote_broadcast_count; status_l.block_count = nano::narrow_cast (last_blocks.size ()); status_l.voter_count = nano::narrow_cast (last_votes.size ()); return nano::election_extended_status{ status_l, last_votes, last_blocks, tally_impl () }; @@ -625,6 +627,7 @@ void nano::election::broadcast_vote_locked (nano::unique_lock & loc if (node.config.enable_voting && node.wallets.reps ().voting > 0) { node.stats.inc (nano::stat::type::election, nano::stat::detail::broadcast_vote); + ++vote_broadcast_count; if (confirmed_locked () || have_quorum (tally_impl ())) { @@ -822,6 +825,7 @@ void nano::election_extended_status::operator() (nano::object_stream & obs) cons obs.write ("tally_amount", status.tally.to_string_dec ()); obs.write ("final_tally_amount", status.final_tally.to_string_dec ()); obs.write ("confirmation_request_count", status.confirmation_request_count); + obs.write ("vote_broadcast_count", status.vote_broadcast_count); obs.write ("block_count", status.block_count); obs.write ("voter_count", status.voter_count); obs.write ("type", status.type); diff --git a/nano/node/election.hpp b/nano/node/election.hpp index 1fe0ad189..78e6c5d8d 100644 --- a/nano/node/election.hpp +++ b/nano/node/election.hpp @@ -97,6 +97,7 @@ public: // Status std::shared_ptr winner () const; std::chrono::milliseconds duration () const; std::atomic confirmation_request_count{ 0 }; + std::atomic vote_broadcast_count{ 0 }; nano::tally_t tally () const; bool have_quorum (nano::tally_t const &) const; diff --git a/nano/node/election_status.hpp b/nano/node/election_status.hpp index 548bf8e2b..a69a49098 100644 --- a/nano/node/election_status.hpp +++ b/nano/node/election_status.hpp @@ -35,6 +35,7 @@ public: std::chrono::milliseconds election_end{ std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()) }; std::chrono::milliseconds election_duration{ std::chrono::duration_values::zero () }; unsigned confirmation_request_count{ 0 }; + unsigned vote_broadcast_count{ 0 }; unsigned block_count{ 0 }; unsigned voter_count{ 0 }; election_status_type type{ nano::election_status_type::inactive_confirmation_height }; diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 8c442f8f1..735da1e0a 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -1196,7 +1196,7 @@ void nano::json_handler::block_confirm () else { // Add record in confirmation history for confirmed block - nano::election_status status{ block_l, 0, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, 1, 0, nano::election_status_type::active_confirmation_height }; + nano::election_status status{ block_l, 0, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, 0, 1, 0, nano::election_status_type::active_confirmation_height }; node.active.recently_cemented.put (status); // Trigger callback for confirmed block auto account = block_l->account ();