Cleaning up stat counters for active_transactions. (#4149)
The stat type active tracks: - active_started for each behavior - active_confirmed/active_timeout/active_dropped for each behavior.
This commit is contained in:
parent
f9e5bbfb47
commit
f98193c7bf
6 changed files with 48 additions and 42 deletions
|
|
@ -646,7 +646,7 @@ TEST (active_transactions, dropped_cleanup)
|
||||||
ASSERT_FALSE (node.network.publish_filter.apply (block_bytes.data (), block_bytes.size ()));
|
ASSERT_FALSE (node.network.publish_filter.apply (block_bytes.data (), block_bytes.size ()));
|
||||||
|
|
||||||
// An election was recently dropped
|
// An election was recently dropped
|
||||||
ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_all));
|
ASSERT_EQ (1, node.stats.count (nano::stat::type::active_dropped, nano::stat::detail::normal));
|
||||||
|
|
||||||
// Block cleared from active
|
// Block cleared from active
|
||||||
ASSERT_FALSE (node.active.active (nano::dev::genesis->hash ()));
|
ASSERT_FALSE (node.active.active (nano::dev::genesis->hash ()));
|
||||||
|
|
@ -664,7 +664,7 @@ TEST (active_transactions, dropped_cleanup)
|
||||||
ASSERT_TRUE (node.network.publish_filter.apply (block_bytes.data (), block_bytes.size ()));
|
ASSERT_TRUE (node.network.publish_filter.apply (block_bytes.data (), block_bytes.size ()));
|
||||||
|
|
||||||
// Not dropped
|
// Not dropped
|
||||||
ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_all));
|
ASSERT_EQ (1, node.stats.count (nano::stat::type::active_dropped, nano::stat::detail::normal));
|
||||||
|
|
||||||
// Block cleared from active
|
// Block cleared from active
|
||||||
ASSERT_FALSE (node.active.active (nano::dev::genesis->hash ()));
|
ASSERT_FALSE (node.active.active (nano::dev::genesis->hash ()));
|
||||||
|
|
@ -1403,7 +1403,7 @@ TEST (active_transactions, fifo)
|
||||||
ASSERT_TIMELY (5s, node.active.size () == 1);
|
ASSERT_TIMELY (5s, node.active.size () == 1);
|
||||||
|
|
||||||
// Ensure overflow stats have been incremented
|
// Ensure overflow stats have been incremented
|
||||||
ASSERT_EQ (1, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_overflow));
|
ASSERT_EQ (1, node.stats.count (nano::stat::type::active_dropped, nano::stat::detail::normal));
|
||||||
|
|
||||||
// Ensure the surviving transaction is the least recently inserted
|
// Ensure the surviving transaction is the least recently inserted
|
||||||
ASSERT_TIMELY (1s, node.active.election (receive2->qualified_root ()) != nullptr);
|
ASSERT_TIMELY (1s, node.active.election (receive2->qualified_root ()) != nullptr);
|
||||||
|
|
@ -1471,7 +1471,7 @@ TEST (active_transactions, limit_vote_hinted_elections)
|
||||||
ASSERT_TIMELY (5s, nano::test::active (node, { open1 }));
|
ASSERT_TIMELY (5s, nano::test::active (node, { open1 }));
|
||||||
|
|
||||||
// Ensure there was no overflow of elections
|
// Ensure there was no overflow of elections
|
||||||
ASSERT_EQ (0, node.stats.count (nano::stat::type::election, nano::stat::detail::election_drop_overflow));
|
ASSERT_EQ (0, node.stats.count (nano::stat::type::active_dropped, nano::stat::detail::normal));
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
||||||
|
|
@ -35,6 +35,10 @@ enum class type : uint8_t
|
||||||
blockprocessor,
|
blockprocessor,
|
||||||
bootstrap_server,
|
bootstrap_server,
|
||||||
active,
|
active,
|
||||||
|
active_started,
|
||||||
|
active_confirmed,
|
||||||
|
active_dropped,
|
||||||
|
active_timeout,
|
||||||
backlog,
|
backlog,
|
||||||
unchecked,
|
unchecked,
|
||||||
|
|
||||||
|
|
@ -142,24 +146,20 @@ enum class detail : uint8_t
|
||||||
vote_cached,
|
vote_cached,
|
||||||
late_block,
|
late_block,
|
||||||
late_block_seconds,
|
late_block_seconds,
|
||||||
election_start,
|
|
||||||
election_confirmed_all,
|
|
||||||
election_block_conflict,
|
election_block_conflict,
|
||||||
election_difficulty_update,
|
|
||||||
election_drop_expired,
|
|
||||||
election_drop_overflow,
|
|
||||||
election_drop_all,
|
|
||||||
election_restart,
|
election_restart,
|
||||||
election_confirmed,
|
|
||||||
election_not_confirmed,
|
election_not_confirmed,
|
||||||
election_hinted_overflow,
|
election_hinted_overflow,
|
||||||
election_hinted_started,
|
|
||||||
election_hinted_confirmed,
|
election_hinted_confirmed,
|
||||||
election_hinted_drop,
|
election_hinted_drop,
|
||||||
generate_vote,
|
generate_vote,
|
||||||
generate_vote_normal,
|
generate_vote_normal,
|
||||||
generate_vote_final,
|
generate_vote_final,
|
||||||
|
|
||||||
|
// election types
|
||||||
|
normal,
|
||||||
|
hinted,
|
||||||
|
|
||||||
// received messages
|
// received messages
|
||||||
invalid_header,
|
invalid_header,
|
||||||
invalid_message_type,
|
invalid_message_type,
|
||||||
|
|
@ -240,7 +240,6 @@ enum class detail : uint8_t
|
||||||
generator_spacing,
|
generator_spacing,
|
||||||
|
|
||||||
// hinting
|
// hinting
|
||||||
hinted,
|
|
||||||
insert_failed,
|
insert_failed,
|
||||||
missing_block,
|
missing_block,
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -235,11 +235,6 @@ void nano::active_transactions::request_confirm (nano::unique_lock<nano::mutex>
|
||||||
|
|
||||||
if (election_l->transition_time (solicitor))
|
if (election_l->transition_time (solicitor))
|
||||||
{
|
{
|
||||||
// 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);
|
erase (election_l->qualified_root);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -257,23 +252,7 @@ void nano::active_transactions::cleanup_election (nano::unique_lock<nano::mutex>
|
||||||
{
|
{
|
||||||
debug_assert (lock_a.owns_lock ());
|
debug_assert (lock_a.owns_lock ());
|
||||||
|
|
||||||
if (!election->confirmed ())
|
node.stats.inc (completion_type (*election), nano::to_stat_detail (election->behavior ()));
|
||||||
{
|
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_drop_all);
|
|
||||||
if (election->behavior () == election_behavior::hinted)
|
|
||||||
{
|
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_hinted_drop);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_confirmed_all);
|
|
||||||
if (election->behavior () == election_behavior::hinted)
|
|
||||||
{
|
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_hinted_confirmed);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (election->behavior () == election_behavior::hinted)
|
if (election->behavior () == election_behavior::hinted)
|
||||||
{
|
{
|
||||||
--active_hinted_elections_count;
|
--active_hinted_elections_count;
|
||||||
|
|
@ -306,13 +285,25 @@ void nano::active_transactions::cleanup_election (nano::unique_lock<nano::mutex>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
node.stats.inc (nano::stat::type::election, election->confirmed () ? nano::stat::detail::election_confirmed : nano::stat::detail::election_not_confirmed);
|
|
||||||
if (node.config.logging.election_result_logging ())
|
if (node.config.logging.election_result_logging ())
|
||||||
{
|
{
|
||||||
node.logger.try_log (boost::str (boost::format ("Election erased for root %1%, confirmed: %2$b") % election->qualified_root.to_string () % election->confirmed ()));
|
node.logger.try_log (boost::str (boost::format ("Election erased for root %1%, confirmed: %2$b") % election->qualified_root.to_string () % election->confirmed ()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nano::stat::type nano::active_transactions::completion_type (nano::election const & election) const
|
||||||
|
{
|
||||||
|
if (election.confirmed ())
|
||||||
|
{
|
||||||
|
return nano::stat::type::active_confirmed;
|
||||||
|
}
|
||||||
|
if (election.failed ())
|
||||||
|
{
|
||||||
|
return nano::stat::type::active_timeout;
|
||||||
|
}
|
||||||
|
return nano::stat::type::active_dropped;
|
||||||
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<nano::election>> nano::active_transactions::list_active (std::size_t max_a)
|
std::vector<std::shared_ptr<nano::election>> nano::active_transactions::list_active (std::size_t max_a)
|
||||||
{
|
{
|
||||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||||
|
|
@ -388,8 +379,8 @@ nano::election_insertion_result nano::active_transactions::insert_impl (nano::un
|
||||||
{
|
{
|
||||||
cache->fill (result.election);
|
cache->fill (result.election);
|
||||||
}
|
}
|
||||||
|
node.stats.inc (nano::stat::type::active_started, nano::to_stat_detail (election_behavior_a));
|
||||||
node.observers.active_started.notify (hash);
|
node.observers.active_started.notify (hash);
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_start);
|
|
||||||
vacancy_update ();
|
vacancy_update ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -420,10 +411,6 @@ nano::election_insertion_result nano::active_transactions::insert_hinted (std::s
|
||||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||||
|
|
||||||
auto result = insert_impl (lock, block_a, nano::election_behavior::hinted);
|
auto result = insert_impl (lock, block_a, nano::election_behavior::hinted);
|
||||||
if (result.inserted)
|
|
||||||
{
|
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_hinted_started);
|
|
||||||
}
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -563,7 +550,6 @@ void nano::active_transactions::erase_oldest ()
|
||||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||||
if (!roots.empty ())
|
if (!roots.empty ())
|
||||||
{
|
{
|
||||||
node.stats.inc (nano::stat::type::election, nano::stat::detail::election_drop_overflow);
|
|
||||||
auto item = roots.get<tag_sequenced> ().front ();
|
auto item = roots.get<tag_sequenced> ().front ();
|
||||||
cleanup_election (lock, item.election);
|
cleanup_election (lock, item.election);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -202,6 +202,7 @@ private:
|
||||||
void erase (nano::qualified_root const &);
|
void erase (nano::qualified_root const &);
|
||||||
// Erase all blocks from active and, if not confirmed, clear digests from network filters
|
// Erase all blocks from active and, if not confirmed, clear digests from network filters
|
||||||
void cleanup_election (nano::unique_lock<nano::mutex> & lock_a, std::shared_ptr<nano::election>);
|
void cleanup_election (nano::unique_lock<nano::mutex> & lock_a, std::shared_ptr<nano::election>);
|
||||||
|
nano::stat::type completion_type (nano::election const & election) const;
|
||||||
// Returns a list of elections sorted by difficulty, mutex must be locked
|
// Returns a list of elections sorted by difficulty, mutex must be locked
|
||||||
std::vector<std::shared_ptr<nano::election>> list_active_impl (std::size_t) const;
|
std::vector<std::shared_ptr<nano::election>> list_active_impl (std::size_t) const;
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -634,6 +634,24 @@ std::vector<nano::vote_with_weight_info> nano::election::votes_with_weight () co
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
nano::stat::detail nano::to_stat_detail (nano::election_behavior behavior)
|
||||||
|
{
|
||||||
|
switch (behavior)
|
||||||
|
{
|
||||||
|
case nano::election_behavior::normal:
|
||||||
|
{
|
||||||
|
return nano::stat::detail::normal;
|
||||||
|
}
|
||||||
|
case nano::election_behavior::hinted:
|
||||||
|
{
|
||||||
|
return nano::stat::detail::hinted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
debug_assert (false, "unknown election behavior");
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
|
||||||
nano::election_behavior nano::election::behavior () const
|
nano::election_behavior nano::election::behavior () const
|
||||||
{
|
{
|
||||||
return behavior_m;
|
return behavior_m;
|
||||||
|
|
|
||||||
|
|
@ -49,6 +49,8 @@ enum class election_behavior
|
||||||
hinted
|
hinted
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nano::stat::detail to_stat_detail (nano::election_behavior);
|
||||||
|
|
||||||
struct election_extended_status final
|
struct election_extended_status final
|
||||||
{
|
{
|
||||||
nano::election_status status;
|
nano::election_status status;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue