From d91016bd3f8fc0958639b8a30d4880ac16dc11f7 Mon Sep 17 00:00:00 2001 From: MajorChump Date: Fri, 28 May 2021 13:53:32 +0100 Subject: [PATCH] Split election drop stats to be either overflow or expired (#3297) At the moment it's not clear if elections are simply expiring after 5 minutes or being dropped due to the container overflowing. This should give us a better insight and allow us to monitor the situation. --- nano/core_test/active_transactions.cpp | 6 ++++-- nano/lib/stats.cpp | 10 ++++++++-- nano/lib/stats.hpp | 4 +++- nano/node/active_transactions.cpp | 8 +++++++- 4 files changed, 22 insertions(+), 6 deletions(-) diff --git a/nano/core_test/active_transactions.cpp b/nano/core_test/active_transactions.cpp index f09117c6e8..8646ab4a25 100644 --- a/nano/core_test/active_transactions.cpp +++ b/nano/core_test/active_transactions.cpp @@ -613,7 +613,7 @@ TEST (active_transactions, dropped_cleanup) ASSERT_FALSE (node.network.publish_filter.apply (block_bytes.data (), block_bytes.size ())); // An election was recently dropped - ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop)); + ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_all)); // Block cleared from active ASSERT_EQ (0, node.active.blocks.count (block->hash ())); @@ -632,7 +632,7 @@ TEST (active_transactions, dropped_cleanup) ASSERT_TRUE (node.network.publish_filter.apply (block_bytes.data (), block_bytes.size ())); // Not dropped - ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop)); + ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_all)); // Block cleared from active ASSERT_EQ (0, node.active.blocks.count (block->hash ())); @@ -1525,6 +1525,8 @@ TEST (active_transactions, fifo) ASSERT_TIMELY (1s, node.active.election (receive1->qualified_root ()) != nullptr); // Ensure excess transactions get trimmed ASSERT_TIMELY (1s, node.active.size () == 1); + // Ensure overflow stats have been incremented + ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_overflow)); // Ensure the surviving transaction is the least recently inserted ASSERT_TIMELY (1s, node.active.election (receive1->qualified_root ()) != nullptr); } diff --git a/nano/lib/stats.cpp b/nano/lib/stats.cpp index f1db603667..0b02dec981 100644 --- a/nano/lib/stats.cpp +++ b/nano/lib/stats.cpp @@ -739,8 +739,14 @@ std::string nano::stat::detail_to_string (uint32_t key) case nano::stat::detail::election_difficulty_update: res = "election_difficulty_update"; break; - case nano::stat::detail::election_drop: - res = "election_drop"; + case nano::stat::detail::election_drop_expired: + res = "election_drop_expired"; + break; + case nano::stat::detail::election_drop_overflow: + res = "election_drop_overflow"; + break; + case nano::stat::detail::election_drop_all: + res = "election_drop_all"; break; case nano::stat::detail::election_restart: res = "election_restart"; diff --git a/nano/lib/stats.hpp b/nano/lib/stats.hpp index 1d28bc6085..9a72089e66 100644 --- a/nano/lib/stats.hpp +++ b/nano/lib/stats.hpp @@ -318,7 +318,9 @@ class stat final election_start, election_block_conflict, election_difficulty_update, - election_drop, + election_drop_expired, + election_drop_overflow, + election_drop_all, election_restart, // udp diff --git a/nano/node/active_transactions.cpp b/nano/node/active_transactions.cpp index 39d95dcb7c..248b659778 100644 --- a/nano/node/active_transactions.cpp +++ b/nano/node/active_transactions.cpp @@ -316,6 +316,7 @@ void nano::active_transactions::request_confirm (nano::unique_lock for (auto const & election_l : elections_l) { bool const confirmed_l (election_l->confirmed ()); + unconfirmed_count_l += !confirmed_l; if (election_l->transition_time (solicitor)) { @@ -330,6 +331,10 @@ void nano::active_transactions::request_confirm (nano::unique_lock } // Locks active mutex, cleans up the election and erases it from the main container + if (!confirmed_l) + { + node.stats.inc (nano::stat::type::election, nano::stat::detail::election_drop_expired); + } erase (election_l->qualified_root); } } @@ -349,7 +354,7 @@ void nano::active_transactions::cleanup_election (nano::unique_lock { if (!election.confirmed ()) { - node.stats.inc (nano::stat::type::election, nano::stat::detail::election_drop); + node.stats.inc (nano::stat::type::election, nano::stat::detail::election_drop_all); } auto blocks_l = election.blocks (); @@ -1049,6 +1054,7 @@ void nano::active_transactions::erase_oldest () nano::unique_lock lock (mutex); if (!roots.empty ()) { + node.stats.inc (nano::stat::type::election, nano::stat::detail::election_drop_overflow); auto item = roots.get ().front (); cleanup_election (lock, *item.election); }