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); }