From 1192c0aa9123465b8d13ffe4934bef6e65b7a013 Mon Sep 17 00:00:00 2001 From: Guilherme Lawless Date: Sun, 29 Sep 2019 20:25:20 +0100 Subject: [PATCH] Add confirmation request count to election_status (#2320) * Add confirmation_request_count to election_status for use in the block confirmation websocket * Only warn for empty block confirmation filter if account filtering options included * Add to confirmation_history as well --- nano/core_test/websocket.cpp | 6 ++++-- nano/node/active_transactions.cpp | 3 ++- nano/node/active_transactions.hpp | 1 + nano/node/election.cpp | 4 +++- nano/node/json_handler.cpp | 3 ++- nano/node/websocket.cpp | 3 ++- nano/rpc_test/rpc.cpp | 5 +++-- 7 files changed, 17 insertions(+), 8 deletions(-) diff --git a/nano/core_test/websocket.cpp b/nano/core_test/websocket.cpp index 92448e7e..9d1c5c77 100644 --- a/nano/core_test/websocket.cpp +++ b/nano/core_test/websocket.cpp @@ -465,8 +465,10 @@ TEST (websocket, confirmation_options) boost::property_tree::ptree election_info = event.get_child ("message.election_info"); auto tally (election_info.get ("tally")); auto time (election_info.get ("time")); - election_info.get ("duration"); - // Make sure tally and time are non-zero. Duration may be zero on testnet, so we only check that it's present (exception thrown otherwise) + // Duration and request count may be zero on testnet, so we only check that they're present + ASSERT_EQ (1, election_info.count ("duration")); + ASSERT_EQ (1, election_info.count ("request_count")); + // Make sure tally and time are non-zero. ASSERT_NE ("0", tally); ASSERT_NE ("0", time); } diff --git a/nano/node/active_transactions.cpp b/nano/node/active_transactions.cpp index f177dbf4..d11f2817 100644 --- a/nano/node/active_transactions.cpp +++ b/nano/node/active_transactions.cpp @@ -110,7 +110,7 @@ void nano::active_transactions::post_confirmation_height_set (nano::transaction bool is_state_send (false); nano::account pending_account (0); node.process_confirmed_data (transaction_a, block_a, block_a->hash (), sideband_a, account, amount, is_state_send, pending_account); - node.observers.blocks.notify (nano::election_status{ block_a, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), nano::election_status_type::inactive_confirmation_height }, account, amount, is_state_send); + node.observers.blocks.notify (nano::election_status{ block_a, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, nano::election_status_type::inactive_confirmation_height }, account, amount, is_state_send); } else { @@ -131,6 +131,7 @@ void nano::active_transactions::post_confirmation_height_set (nano::transaction nano::account pending_account (0); node.process_confirmed_data (transaction_a, block_a, hash, sideband_a, account, amount, is_state_send, pending_account); election->status.type = election_status_type_a; + election->status.confirmation_request_count = election->confirmation_request_count; node.observers.blocks.notify (election->status, account, amount, is_state_send); if (amount > 0) { diff --git a/nano/node/active_transactions.hpp b/nano/node/active_transactions.hpp index f3d4a1f5..23869a66 100644 --- a/nano/node/active_transactions.hpp +++ b/nano/node/active_transactions.hpp @@ -57,6 +57,7 @@ public: nano::amount tally; std::chrono::milliseconds election_end; std::chrono::milliseconds election_duration; + unsigned confirmation_request_count; election_status_type type; }; diff --git a/nano/node/election.cpp b/nano/node/election.cpp index ce2b4f8b..3a72c8bb 100644 --- a/nano/node/election.cpp +++ b/nano/node/election.cpp @@ -11,7 +11,7 @@ nano::election::election (nano::node & node_a, std::shared_ptr bloc confirmation_action (confirmation_action_a), node (node_a), election_start (std::chrono::steady_clock::now ()), -status ({ block_a, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), nano::election_status_type::ongoing }), +status ({ block_a, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, nano::election_status_type::ongoing }), confirmed (false), stopped (false), confirmation_request_count (0) @@ -38,6 +38,7 @@ void nano::election::confirm_once (nano::election_status_type type_a) { status.election_end = std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()); status.election_duration = std::chrono::duration_cast (std::chrono::steady_clock::now () - election_start); + status.confirmation_request_count = confirmation_request_count; status.type = type_a; auto status_l (status); auto node_l (node.shared ()); @@ -65,6 +66,7 @@ void nano::election::stop () stopped = true; status.election_end = std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()); status.election_duration = std::chrono::duration_cast (std::chrono::steady_clock::now () - election_start); + status.confirmation_request_count = confirmation_request_count; status.type = nano::election_status_type::stopped; } } diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 51442ed9..94c499a5 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -1001,7 +1001,7 @@ void nano::json_handler::block_confirm () else { // Add record in confirmation history for confirmed block - nano::election_status status{ block_l, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), nano::election_status_type::active_confirmation_height }; + nano::election_status status{ block_l, 0, std::chrono::duration_cast (std::chrono::system_clock::now ().time_since_epoch ()), std::chrono::duration_values::zero (), 0, nano::election_status_type::active_confirmation_height }; { nano::lock_guard lock (node.active.mutex); node.active.confirmed.push_back (status); @@ -1795,6 +1795,7 @@ void nano::json_handler::confirmation_history () election.put ("duration", i->election_duration.count ()); election.put ("time", i->election_end.count ()); election.put ("tally", i->tally.to_string_dec ()); + election.put ("request_count", i->confirmation_request_count); elections.push_back (std::make_pair ("", election)); } running_total += i->election_duration; diff --git a/nano/node/websocket.cpp b/nano/node/websocket.cpp index 6868e901..bfa77494 100644 --- a/nano/node/websocket.cpp +++ b/nano/node/websocket.cpp @@ -79,7 +79,7 @@ node (node_a) } } // Warn the user if the options resulted in an empty filter - if (!all_local_accounts && accounts.empty ()) + if (has_account_filtering_options && !all_local_accounts && accounts.empty ()) { node.logger.always_log ("Websocket: provided options resulted in an empty block confirmation filter"); } @@ -629,6 +629,7 @@ nano::websocket::message nano::websocket::message_builder::block_confirmed (std: election_node_l.add ("duration", election_status_a.election_duration.count ()); election_node_l.add ("time", election_status_a.election_end.count ()); election_node_l.add ("tally", election_status_a.tally.to_string_dec ()); + election_node_l.add ("request_count", election_status_a.confirmation_request_count); message_node_l.add_child ("election_info", election_node_l); } diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index 15dbe8ff..e6c26848 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -6002,8 +6002,9 @@ TEST (rpc, confirmation_history) ASSERT_NE (representatives.end (), item); auto hash (item->second.get ("hash")); auto tally (item->second.get ("tally")); - ASSERT_FALSE (item->second.get ("duration", "").empty ()); - ASSERT_FALSE (item->second.get ("time", "").empty ()); + ASSERT_EQ (1, item->second.count ("duration")); + ASSERT_EQ (1, item->second.count ("time")); + ASSERT_EQ (1, item->second.count ("request_count")); ASSERT_EQ (block->hash ().to_string (), hash); nano::amount tally_num; tally_num.decode_dec (tally);