Some code cleanup (#2449)
* Some code cleanup * Forgot to include config.hpp file
This commit is contained in:
		
					parent
					
						
							
								d13ab81641
							
						
					
				
			
			
				commit
				
					
						91460e4845
					
				
			
		
					 54 changed files with 359 additions and 407 deletions
				
			
		| 
						 | 
				
			
			@ -42,6 +42,9 @@ TEST (locks, no_conflicts)
 | 
			
		|||
 | 
			
		||||
TEST (locks, lock_guard)
 | 
			
		||||
{
 | 
			
		||||
	// This test can end up taking a long time, as it sleeps for the NANO_TIMED_LOCKS amount
 | 
			
		||||
	ASSERT_LE (NANO_TIMED_LOCKS, 10000);
 | 
			
		||||
 | 
			
		||||
	std::stringstream ss;
 | 
			
		||||
	nano::cout_redirect redirect (ss.rdbuf ());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -72,6 +75,9 @@ TEST (locks, lock_guard)
 | 
			
		|||
 | 
			
		||||
TEST (locks, unique_lock)
 | 
			
		||||
{
 | 
			
		||||
	// This test can end up taking a long time, as it sleeps for the NANO_TIMED_LOCKS amount
 | 
			
		||||
	ASSERT_LE (NANO_TIMED_LOCKS, 10000);
 | 
			
		||||
 | 
			
		||||
	std::stringstream ss;
 | 
			
		||||
	nano::cout_redirect redirect (ss.rdbuf ());
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,18 +64,15 @@ void nano::alarm::add (std::chrono::steady_clock::time_point const & wakeup_a, s
 | 
			
		|||
	condition.notify_all ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (alarm & alarm, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (alarm & alarm, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (alarm.mutex);
 | 
			
		||||
		count = alarm.operations.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (alarm.operations)::value_type);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "operations", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "operations", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,6 @@ public:
 | 
			
		|||
	std::priority_queue<operation, std::vector<operation>, std::greater<operation>> operations;
 | 
			
		||||
	std::thread thread;
 | 
			
		||||
};
 | 
			
		||||
class seq_con_info_component;
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (alarm & alarm, const std::string & name);
 | 
			
		||||
class container_info_component;
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (alarm & alarm, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1619,14 +1619,11 @@ size_t nano::block_uniquer::size ()
 | 
			
		|||
	return blocks.size ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_uniquer & block_uniquer, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (block_uniquer & block_uniquer, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto count = block_uniquer.size ();
 | 
			
		||||
	auto sizeof_element = sizeof (block_uniquer::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "blocks", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocks", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -357,7 +357,7 @@ private:
 | 
			
		|||
	static unsigned constexpr cleanup_count = 2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_uniquer & block_uniquer, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (block_uniquer & block_uniquer, const std::string & name);
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::block> deserialize_block (nano::stream &);
 | 
			
		||||
std::shared_ptr<nano::block> deserialize_block (nano::stream &, nano::block_type, nano::block_uniquer * = nullptr);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -19,19 +19,19 @@ namespace filesystem
 | 
			
		|||
/**
 | 
			
		||||
* Returns build version information
 | 
			
		||||
*/
 | 
			
		||||
static const char * NANO_VERSION_STRING = xstr (TAG_VERSION_STRING);
 | 
			
		||||
const char * const NANO_VERSION_STRING = xstr (TAG_VERSION_STRING);
 | 
			
		||||
 | 
			
		||||
static const char * BUILD_INFO = xstr (GIT_COMMIT_HASH BOOST_COMPILER) " \"BOOST " xstr (BOOST_VERSION) "\" BUILT " xstr (__DATE__);
 | 
			
		||||
const char * const BUILD_INFO = xstr (GIT_COMMIT_HASH BOOST_COMPILER) " \"BOOST " xstr (BOOST_VERSION) "\" BUILT " xstr (__DATE__);
 | 
			
		||||
 | 
			
		||||
/** Is TSAN/ASAN test build */
 | 
			
		||||
#if defined(__has_feature)
 | 
			
		||||
#if __has_feature(thread_sanitizer) || __has_feature(address_sanitizer)
 | 
			
		||||
static const bool is_sanitizer_build = true;
 | 
			
		||||
const bool is_sanitizer_build = true;
 | 
			
		||||
#else
 | 
			
		||||
static const bool is_sanitizer_build = false;
 | 
			
		||||
const bool is_sanitizer_build = false;
 | 
			
		||||
#endif
 | 
			
		||||
#else
 | 
			
		||||
static const bool is_sanitizer_build = false;
 | 
			
		||||
const bool is_sanitizer_build = false;
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -54,16 +54,16 @@ nano::uint128_t nano::rep_weights::get (nano::account const & account_a)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::seq_con_info_component> nano::collect_seq_con_info (nano::rep_weights & rep_weights, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (nano::rep_weights & rep_weights, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t rep_amounts_count = 0;
 | 
			
		||||
	size_t rep_amounts_count;
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (rep_weights.mutex);
 | 
			
		||||
		rep_amounts_count = rep_weights.rep_amounts.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (rep_weights.rep_amounts)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<nano::seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<nano::seq_con_info_leaf> (seq_con_info{ "rep_amounts", rep_amounts_count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<nano::container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<nano::container_info_leaf> (container_info{ "rep_amounts", rep_amounts_count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,8 +26,8 @@ private:
 | 
			
		|||
	void put (nano::account const & account_a, nano::uint128_union const & representation_a);
 | 
			
		||||
	nano::uint128_t get (nano::account const & account_a);
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (rep_weights &, const std::string &);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (rep_weights &, const std::string &);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (rep_weights &, const std::string &);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (rep_weights &, const std::string &);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2,104 +2,97 @@
 | 
			
		|||
 | 
			
		||||
#include <iostream>
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
namespace thread_role
 | 
			
		||||
thread_local nano::thread_role::name current_thread_role = nano::thread_role::name::unknown;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::thread_role::name nano::thread_role::get ()
 | 
			
		||||
{
 | 
			
		||||
	/*
 | 
			
		||||
	 * nano::thread_role namespace
 | 
			
		||||
	 *
 | 
			
		||||
	 * Manage thread role
 | 
			
		||||
	 */
 | 
			
		||||
	static thread_local nano::thread_role::name current_thread_role = nano::thread_role::name::unknown;
 | 
			
		||||
	nano::thread_role::name get ()
 | 
			
		||||
	return current_thread_role;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string nano::thread_role::get_string (nano::thread_role::name role)
 | 
			
		||||
{
 | 
			
		||||
	std::string thread_role_name_string;
 | 
			
		||||
 | 
			
		||||
	switch (role)
 | 
			
		||||
	{
 | 
			
		||||
		return current_thread_role;
 | 
			
		||||
		case nano::thread_role::name::unknown:
 | 
			
		||||
			thread_role_name_string = "<unknown>";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::io:
 | 
			
		||||
			thread_role_name_string = "I/O";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::work:
 | 
			
		||||
			thread_role_name_string = "Work pool";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::packet_processing:
 | 
			
		||||
			thread_role_name_string = "Pkt processing";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::alarm:
 | 
			
		||||
			thread_role_name_string = "Alarm";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::vote_processing:
 | 
			
		||||
			thread_role_name_string = "Vote processing";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::block_processing:
 | 
			
		||||
			thread_role_name_string = "Blck processing";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::request_loop:
 | 
			
		||||
			thread_role_name_string = "Request loop";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::wallet_actions:
 | 
			
		||||
			thread_role_name_string = "Wallet actions";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::work_watcher:
 | 
			
		||||
			thread_role_name_string = "Work watcher";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::bootstrap_initiator:
 | 
			
		||||
			thread_role_name_string = "Bootstrap init";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::voting:
 | 
			
		||||
			thread_role_name_string = "Voting";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::signature_checking:
 | 
			
		||||
			thread_role_name_string = "Signature check";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::rpc_request_processor:
 | 
			
		||||
			thread_role_name_string = "RPC processor";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::rpc_process_container:
 | 
			
		||||
			thread_role_name_string = "RPC process";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::confirmation_height_processing:
 | 
			
		||||
			thread_role_name_string = "Conf height";
 | 
			
		||||
			break;
 | 
			
		||||
		case nano::thread_role::name::worker:
 | 
			
		||||
			thread_role_name_string = "Worker";
 | 
			
		||||
			break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::string get_string (nano::thread_role::name role)
 | 
			
		||||
	{
 | 
			
		||||
		std::string thread_role_name_string;
 | 
			
		||||
 | 
			
		||||
		switch (role)
 | 
			
		||||
		{
 | 
			
		||||
			case nano::thread_role::name::unknown:
 | 
			
		||||
				thread_role_name_string = "<unknown>";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::io:
 | 
			
		||||
				thread_role_name_string = "I/O";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::work:
 | 
			
		||||
				thread_role_name_string = "Work pool";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::packet_processing:
 | 
			
		||||
				thread_role_name_string = "Pkt processing";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::alarm:
 | 
			
		||||
				thread_role_name_string = "Alarm";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::vote_processing:
 | 
			
		||||
				thread_role_name_string = "Vote processing";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::block_processing:
 | 
			
		||||
				thread_role_name_string = "Blck processing";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::request_loop:
 | 
			
		||||
				thread_role_name_string = "Request loop";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::wallet_actions:
 | 
			
		||||
				thread_role_name_string = "Wallet actions";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::work_watcher:
 | 
			
		||||
				thread_role_name_string = "Work watcher";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::bootstrap_initiator:
 | 
			
		||||
				thread_role_name_string = "Bootstrap init";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::voting:
 | 
			
		||||
				thread_role_name_string = "Voting";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::signature_checking:
 | 
			
		||||
				thread_role_name_string = "Signature check";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::rpc_request_processor:
 | 
			
		||||
				thread_role_name_string = "RPC processor";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::rpc_process_container:
 | 
			
		||||
				thread_role_name_string = "RPC process";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::confirmation_height_processing:
 | 
			
		||||
				thread_role_name_string = "Conf height";
 | 
			
		||||
				break;
 | 
			
		||||
			case nano::thread_role::name::worker:
 | 
			
		||||
				thread_role_name_string = "Worker";
 | 
			
		||||
				break;
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		/*
 | 
			
		||||
	/*
 | 
			
		||||
		 * We want to constrain the thread names to 15
 | 
			
		||||
		 * characters, since this is the smallest maximum
 | 
			
		||||
		 * length supported by the platforms we support
 | 
			
		||||
		 * (specifically, Linux)
 | 
			
		||||
		 */
 | 
			
		||||
		assert (thread_role_name_string.size () < 16);
 | 
			
		||||
		return (thread_role_name_string);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	std::string get_string ()
 | 
			
		||||
	{
 | 
			
		||||
		return get_string (current_thread_role);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	void set (nano::thread_role::name role)
 | 
			
		||||
	{
 | 
			
		||||
		auto thread_role_name_string (get_string (role));
 | 
			
		||||
 | 
			
		||||
		nano::thread_role::set_os_name (thread_role_name_string);
 | 
			
		||||
 | 
			
		||||
		nano::thread_role::current_thread_role = role;
 | 
			
		||||
	}
 | 
			
		||||
	assert (thread_role_name_string.size () < 16);
 | 
			
		||||
	return (thread_role_name_string);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string nano::thread_role::get_string ()
 | 
			
		||||
{
 | 
			
		||||
	return get_string (current_thread_role);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::thread_role::set (nano::thread_role::name role)
 | 
			
		||||
{
 | 
			
		||||
	auto thread_role_name_string (get_string (role));
 | 
			
		||||
 | 
			
		||||
	nano::thread_role::set_os_name (thread_role_name_string);
 | 
			
		||||
 | 
			
		||||
	current_thread_role = role;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::thread_attributes::set (boost::thread::attributes & attrs)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -27,61 +27,58 @@
 | 
			
		|||
#endif
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
seq_con_info_composite::seq_con_info_composite (const std::string & name) :
 | 
			
		||||
nano::container_info_composite::container_info_composite (const std::string & name) :
 | 
			
		||||
name (name)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool seq_con_info_composite::is_composite () const
 | 
			
		||||
bool nano::container_info_composite::is_composite () const
 | 
			
		||||
{
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void seq_con_info_composite::add_component (std::unique_ptr<seq_con_info_component> child)
 | 
			
		||||
void nano::container_info_composite::add_component (std::unique_ptr<container_info_component> child)
 | 
			
		||||
{
 | 
			
		||||
	children.push_back (std::move (child));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const std::vector<std::unique_ptr<seq_con_info_component>> & seq_con_info_composite::get_children () const
 | 
			
		||||
const std::vector<std::unique_ptr<nano::container_info_component>> & nano::container_info_composite::get_children () const
 | 
			
		||||
{
 | 
			
		||||
	return children;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const std::string & seq_con_info_composite::get_name () const
 | 
			
		||||
const std::string & nano::container_info_composite::get_name () const
 | 
			
		||||
{
 | 
			
		||||
	return name;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
seq_con_info_leaf::seq_con_info_leaf (const seq_con_info & info) :
 | 
			
		||||
nano::container_info_leaf::container_info_leaf (const container_info & info) :
 | 
			
		||||
info (info)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool seq_con_info_leaf::is_composite () const
 | 
			
		||||
bool nano::container_info_leaf::is_composite () const
 | 
			
		||||
{
 | 
			
		||||
	return false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
const seq_con_info & seq_con_info_leaf::get_info () const
 | 
			
		||||
const nano::container_info & nano::container_info_leaf::get_info () const
 | 
			
		||||
{
 | 
			
		||||
	return info;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void dump_crash_stacktrace ()
 | 
			
		||||
void nano::dump_crash_stacktrace ()
 | 
			
		||||
{
 | 
			
		||||
	boost::stacktrace::safe_dump_to ("nano_node_backtrace.dump");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::string generate_stacktrace ()
 | 
			
		||||
std::string nano::generate_stacktrace ()
 | 
			
		||||
{
 | 
			
		||||
	auto stacktrace = boost::stacktrace::stacktrace ();
 | 
			
		||||
	std::stringstream ss;
 | 
			
		||||
	ss << stacktrace;
 | 
			
		||||
	return ss.str ();
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::remove_all_files_in_dir (boost::filesystem::path const & dir)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -25,43 +25,43 @@ namespace nano
 | 
			
		|||
 * It makes use of the composite design pattern to collect information
 | 
			
		||||
 * from sequence containers and sequence containers inside member variables.
 | 
			
		||||
 */
 | 
			
		||||
struct seq_con_info
 | 
			
		||||
struct container_info
 | 
			
		||||
{
 | 
			
		||||
	std::string name;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	size_t sizeof_element;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class seq_con_info_component
 | 
			
		||||
class container_info_component
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	virtual ~seq_con_info_component () = default;
 | 
			
		||||
	virtual ~container_info_component () = default;
 | 
			
		||||
	virtual bool is_composite () const = 0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class seq_con_info_composite : public seq_con_info_component
 | 
			
		||||
class container_info_composite : public container_info_component
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	seq_con_info_composite (const std::string & name);
 | 
			
		||||
	container_info_composite (const std::string & name);
 | 
			
		||||
	bool is_composite () const override;
 | 
			
		||||
	void add_component (std::unique_ptr<seq_con_info_component> child);
 | 
			
		||||
	const std::vector<std::unique_ptr<seq_con_info_component>> & get_children () const;
 | 
			
		||||
	void add_component (std::unique_ptr<container_info_component> child);
 | 
			
		||||
	const std::vector<std::unique_ptr<container_info_component>> & get_children () const;
 | 
			
		||||
	const std::string & get_name () const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	std::string name;
 | 
			
		||||
	std::vector<std::unique_ptr<seq_con_info_component>> children;
 | 
			
		||||
	std::vector<std::unique_ptr<container_info_component>> children;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class seq_con_info_leaf : public seq_con_info_component
 | 
			
		||||
class container_info_leaf : public container_info_component
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
	seq_con_info_leaf (const seq_con_info & info);
 | 
			
		||||
	container_info_leaf (container_info const & info);
 | 
			
		||||
	bool is_composite () const override;
 | 
			
		||||
	const seq_con_info & get_info () const;
 | 
			
		||||
	const container_info & get_info () const;
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	seq_con_info info;
 | 
			
		||||
	container_info info;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
// Lower priority of calling work generating thread
 | 
			
		||||
| 
						 | 
				
			
			@ -131,7 +131,7 @@ public:
 | 
			
		|||
};
 | 
			
		||||
 | 
			
		||||
template <typename... T>
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (observer_set<T...> & observer_set, const std::string & name)
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (observer_set<T...> & observer_set, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -140,8 +140,8 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (observer_set<T...>
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	auto sizeof_element = sizeof (typename decltype (observer_set.observers)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "observers", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "observers", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -243,20 +243,16 @@ size_t nano::work_pool::size ()
 | 
			
		|||
	return pending.size ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (work_pool & work_pool, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (work_pool & work_pool, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (work_pool.mutex);
 | 
			
		||||
		count = work_pool.pending.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (work_pool.pending)::value_type);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "pending", count, sizeof_element }));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (work_pool.work_observers, "work_observers"));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "pending", count, sizeof_element }));
 | 
			
		||||
	composite->add_component (collect_container_info (work_pool.work_observers, "work_observers"));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -56,5 +56,5 @@ public:
 | 
			
		|||
	nano::observer_set<bool> work_observers;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (work_pool & work_pool, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (work_pool & work_pool, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,16 +64,15 @@ void nano::worker::stop ()
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::seq_con_info_component> nano::collect_seq_con_info (nano::worker & worker, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (nano::worker & worker, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (worker.mutex);
 | 
			
		||||
		count = worker.queue.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (worker.queue)::value_type);
 | 
			
		||||
	composite->add_component (std::make_unique<nano::seq_con_info_leaf> (nano::seq_con_info{ "queue", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<nano::container_info_leaf> (nano::container_info{ "queue", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -26,8 +26,8 @@ private:
 | 
			
		|||
	bool stopped{ false };
 | 
			
		||||
	std::thread thread;
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (worker &, const std::string &);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (worker &, const std::string &);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (worker & worker, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (worker & worker, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -1170,14 +1170,12 @@ account (account_a), blocks_uncemented (blocks_uncemented_a)
 | 
			
		|||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (active_transactions & active_transactions, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (active_transactions & active_transactions, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t roots_count = 0;
 | 
			
		||||
	size_t blocks_count = 0;
 | 
			
		||||
	size_t confirmed_count = 0;
 | 
			
		||||
	size_t pending_conf_height_count = 0;
 | 
			
		||||
	size_t roots_count;
 | 
			
		||||
	size_t blocks_count;
 | 
			
		||||
	size_t confirmed_count;
 | 
			
		||||
	size_t pending_conf_height_count;
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (active_transactions.mutex);
 | 
			
		||||
| 
						 | 
				
			
			@ -1187,15 +1185,14 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (active_transaction
 | 
			
		|||
		pending_conf_height_count = active_transactions.pending_conf_height.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "roots", roots_count, sizeof (decltype (active_transactions.roots)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "blocks", blocks_count, sizeof (decltype (active_transactions.blocks)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "pending_conf_height", pending_conf_height_count, sizeof (decltype (active_transactions.pending_conf_height)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "confirmed", confirmed_count, sizeof (decltype (active_transactions.confirmed)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "priority_wallet_cementable_frontiers_count", active_transactions.priority_wallet_cementable_frontiers_size (), sizeof (nano::cementable_account) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "priority_cementable_frontiers_count", active_transactions.priority_cementable_frontiers_size (), sizeof (nano::cementable_account) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "inactive_votes_cache_count", active_transactions.inactive_votes_cache_size (), sizeof (nano::gap_information) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "dropped_elections_count", active_transactions.dropped_elections_cache_size (), sizeof (nano::election_timepoint) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "roots", roots_count, sizeof (decltype (active_transactions.roots)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocks", blocks_count, sizeof (decltype (active_transactions.blocks)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "pending_conf_height", pending_conf_height_count, sizeof (decltype (active_transactions.pending_conf_height)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "confirmed", confirmed_count, sizeof (decltype (active_transactions.confirmed)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "priority_wallet_cementable_frontiers_count", active_transactions.priority_wallet_cementable_frontiers_size (), sizeof (nano::cementable_account) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "priority_cementable_frontiers_count", active_transactions.priority_cementable_frontiers_size (), sizeof (nano::cementable_account) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "inactive_votes_cache_count", active_transactions.inactive_votes_cache_size (), sizeof (nano::gap_information) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "dropped_elections_count", active_transactions.dropped_elections_cache_size (), sizeof (nano::election_timepoint) }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -221,5 +221,5 @@ private:
 | 
			
		|||
	friend class confirmation_height_long_chains_Test;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (active_transactions & active_transactions, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (active_transactions & active_transactions, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -68,6 +68,6 @@ private:
 | 
			
		|||
	nano::write_database_queue & write_database_queue;
 | 
			
		||||
	std::mutex mutex;
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_processor & block_processor, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (block_processor & block_processor, const std::string & name);
 | 
			
		||||
};
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1500,13 +1500,11 @@ void nano::bootstrap_initiator::notify_listeners (bool in_progress_a)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (bootstrap_initiator & bootstrap_initiator, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (bootstrap_initiator & bootstrap_initiator, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	size_t cache_count = 0;
 | 
			
		||||
	size_t excluded_peers_count = 0;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	size_t cache_count;
 | 
			
		||||
	size_t excluded_peers_count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (bootstrap_initiator.observers_mutex);
 | 
			
		||||
		count = bootstrap_initiator.observers.size ();
 | 
			
		||||
| 
						 | 
				
			
			@ -1523,13 +1521,12 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (bootstrap_initiato
 | 
			
		|||
	auto sizeof_element = sizeof (decltype (bootstrap_initiator.observers)::value_type);
 | 
			
		||||
	auto sizeof_cache_element = sizeof (decltype (bootstrap_initiator.cache.cache)::value_type);
 | 
			
		||||
	auto sizeof_excluded_peers_element = sizeof (decltype (bootstrap_initiator.excluded_peers.peers)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "observers", count, sizeof_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "pulls_cache", cache_count, sizeof_cache_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "excluded_peers", excluded_peers_count, sizeof_excluded_peers_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "observers", count, sizeof_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "pulls_cache", cache_count, sizeof_cache_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "excluded_peers", excluded_peers_count, sizeof_excluded_peers_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::pulls_cache::add (nano::pull_info const & pull_a)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -271,10 +271,10 @@ private:
 | 
			
		|||
	std::vector<std::function<void(bool)>> observers;
 | 
			
		||||
	boost::thread thread;
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (bootstrap_initiator & bootstrap_initiator, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (bootstrap_initiator & bootstrap_initiator, const std::string & name);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (bootstrap_initiator & bootstrap_initiator, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (bootstrap_initiator & bootstrap_initiator, const std::string & name);
 | 
			
		||||
class bootstrap_limits final
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -73,16 +73,13 @@ boost::asio::ip::tcp::endpoint nano::bootstrap_listener::endpoint ()
 | 
			
		|||
	return boost::asio::ip::tcp::endpoint (boost::asio::ip::address_v6::loopback (), listening_socket->listening_port ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (bootstrap_listener & bootstrap_listener, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (bootstrap_listener & bootstrap_listener, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (bootstrap_listener.connections)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "connections", bootstrap_listener.connection_count (), sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "connections", bootstrap_listener.connection_count (), sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::bootstrap_server::bootstrap_server (std::shared_ptr<nano::socket> socket_a, std::shared_ptr<nano::node> node_a) :
 | 
			
		||||
receive_buffer (std::make_shared<std::vector<uint8_t>> ()),
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -31,7 +31,7 @@ private:
 | 
			
		|||
	uint16_t port;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (bootstrap_listener & bootstrap_listener, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (bootstrap_listener & bootstrap_listener, const std::string & name);
 | 
			
		||||
 | 
			
		||||
class message;
 | 
			
		||||
enum class bootstrap_server_type
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -431,9 +431,7 @@ void nano::confirmation_height_processor::collect_unconfirmed_receive_and_source
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
confirmation_height_processor::conf_height_details::conf_height_details (nano::account const & account_a, nano::block_hash const & hash_a, uint64_t height_a, uint64_t num_blocks_confirmed_a, std::vector<callback_data> const & block_callbacks_required_a) :
 | 
			
		||||
nano::confirmation_height_processor::conf_height_details::conf_height_details (nano::account const & account_a, nano::block_hash const & hash_a, uint64_t height_a, uint64_t num_blocks_confirmed_a, std::vector<callback_data> const & block_callbacks_required_a) :
 | 
			
		||||
account (account_a),
 | 
			
		||||
hash (hash_a),
 | 
			
		||||
height (height_a),
 | 
			
		||||
| 
						 | 
				
			
			@ -442,32 +440,31 @@ block_callbacks_required (block_callbacks_required_a)
 | 
			
		|||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
confirmation_height_processor::receive_source_pair::receive_source_pair (confirmation_height_processor::conf_height_details const & receive_details_a, const block_hash & source_a) :
 | 
			
		||||
nano::confirmation_height_processor::receive_source_pair::receive_source_pair (confirmation_height_processor::conf_height_details const & receive_details_a, const block_hash & source_a) :
 | 
			
		||||
receive_details (receive_details_a),
 | 
			
		||||
source_hash (source_a)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
confirmation_height_processor::confirmed_iterated_pair::confirmed_iterated_pair (uint64_t confirmed_height_a, uint64_t iterated_height_a) :
 | 
			
		||||
nano::confirmation_height_processor::confirmed_iterated_pair::confirmed_iterated_pair (uint64_t confirmed_height_a, uint64_t iterated_height_a) :
 | 
			
		||||
confirmed_height (confirmed_height_a), iterated_height (iterated_height_a)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
confirmation_height_processor::callback_data::callback_data (std::shared_ptr<nano::block> const & block_a, nano::block_sideband const & sideband_a, nano::election_status_type election_status_type_a) :
 | 
			
		||||
nano::confirmation_height_processor::callback_data::callback_data (std::shared_ptr<nano::block> const & block_a, nano::block_sideband const & sideband_a, nano::election_status_type election_status_type_a) :
 | 
			
		||||
block (block_a),
 | 
			
		||||
sideband (sideband_a),
 | 
			
		||||
election_status_type (election_status_type_a)
 | 
			
		||||
{
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (confirmation_height_processor & confirmation_height_processor_a, const std::string & name_a)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (confirmation_height_processor & confirmation_height_processor_a, const std::string & name_a)
 | 
			
		||||
{
 | 
			
		||||
	size_t receive_source_pairs_count = confirmation_height_processor_a.receive_source_pairs_size;
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name_a);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "receive_source_pairs", receive_source_pairs_count, sizeof (decltype (confirmation_height_processor_a.receive_source_pairs)::value_type) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name_a);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "receive_source_pairs", receive_source_pairs_count, sizeof (decltype (confirmation_height_processor_a.receive_source_pairs)::value_type) }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
size_t nano::pending_confirmation_height::size ()
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -494,13 +491,10 @@ nano::block_hash nano::pending_confirmation_height::current ()
 | 
			
		|||
	return current_hash;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (pending_confirmation_height & pending_confirmation_height_a, const std::string & name_a)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (pending_confirmation_height & pending_confirmation_height_a, const std::string & name_a)
 | 
			
		||||
{
 | 
			
		||||
	size_t pending_count = pending_confirmation_height_a.size ();
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name_a);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "pending", pending_count, sizeof (nano::block_hash) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name_a);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "pending", pending_count, sizeof (nano::block_hash) }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,7 +36,7 @@ private:
 | 
			
		|||
	friend class confirmation_height_dependent_election_after_already_cemented_Test;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (pending_confirmation_height &, const std::string &);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (pending_confirmation_height &, const std::string &);
 | 
			
		||||
 | 
			
		||||
class confirmation_height_processor final
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -117,9 +117,9 @@ private:
 | 
			
		|||
	void collect_unconfirmed_receive_and_sources_for_account (uint64_t, uint64_t, nano::block_hash const &, nano::account const &, nano::read_transaction const &, std::vector<callback_data> &);
 | 
			
		||||
	bool write_pending (std::deque<conf_height_details> &);
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (confirmation_height_processor &, const std::string &);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (confirmation_height_processor &, const std::string &);
 | 
			
		||||
	friend class confirmation_height_pending_observer_callbacks_Test;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (confirmation_height_processor &, const std::string &);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (confirmation_height_processor &, const std::string &);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -135,9 +135,7 @@ nano::error nano::daemon_config::deserialize_json (bool & upgraded_a, nano::json
 | 
			
		|||
	return json.get_error ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
nano::error read_node_config_toml (boost::filesystem::path const & data_path_a, nano::daemon_config & config_a, std::vector<std::string> const & config_overrides)
 | 
			
		||||
nano::error nano::read_node_config_toml (boost::filesystem::path const & data_path_a, nano::daemon_config & config_a, std::vector<std::string> const & config_overrides)
 | 
			
		||||
{
 | 
			
		||||
	nano::error error;
 | 
			
		||||
	auto json_config_path = nano::get_config_path (data_path_a);
 | 
			
		||||
| 
						 | 
				
			
			@ -237,7 +235,7 @@ nano::error read_node_config_toml (boost::filesystem::path const & data_path_a,
 | 
			
		|||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::error read_and_update_daemon_config (boost::filesystem::path const & data_path, nano::daemon_config & config_a, nano::jsonconfig & json_a)
 | 
			
		||||
nano::error nano::read_and_update_daemon_config (boost::filesystem::path const & data_path, nano::daemon_config & config_a, nano::jsonconfig & json_a)
 | 
			
		||||
{
 | 
			
		||||
	boost::system::error_code error_chmod;
 | 
			
		||||
	auto config_path = nano::get_config_path (data_path);
 | 
			
		||||
| 
						 | 
				
			
			@ -245,4 +243,3 @@ nano::error read_and_update_daemon_config (boost::filesystem::path const & data_
 | 
			
		|||
	nano::set_secure_perm_file (config_path, error_chmod);
 | 
			
		||||
	return error;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,19 +97,16 @@ void nano::distributed_work_factory::stop ()
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (distributed_work_factory & distributed_work, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (distributed_work_factory & distributed_work, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t item_count = 0;
 | 
			
		||||
	size_t item_count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (distributed_work.mutex);
 | 
			
		||||
		item_count = distributed_work.items.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	auto sizeof_item_element = sizeof (decltype (distributed_work.items)::value_type);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "items", item_count, sizeof_item_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "items", item_count, sizeof_item_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -33,6 +33,6 @@ public:
 | 
			
		|||
	std::atomic<bool> stopped{ false };
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
class seq_con_info_component;
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (distributed_work_factory & distributed_work, const std::string & name);
 | 
			
		||||
class container_info_component;
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (distributed_work_factory & distributed_work, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -123,14 +123,11 @@ size_t nano::gap_cache::size ()
 | 
			
		|||
	return blocks.size ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (gap_cache & gap_cache, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (gap_cache & gap_cache, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto count = gap_cache.size ();
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (gap_cache.blocks)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "blocks", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocks", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -57,5 +57,5 @@ public:
 | 
			
		|||
	nano::node & node;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (gap_cache & gap_cache, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (gap_cache & gap_cache, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -16,7 +16,7 @@
 | 
			
		|||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
void construct_json (nano::seq_con_info_component * component, boost::property_tree::ptree & parent);
 | 
			
		||||
void construct_json (nano::container_info_component * component, boost::property_tree::ptree & parent);
 | 
			
		||||
using ipc_json_handler_no_arg_func_map = std::unordered_map<std::string, std::function<void(nano::json_handler *)>>;
 | 
			
		||||
ipc_json_handler_no_arg_func_map create_ipc_json_handler_no_arg_func_map ();
 | 
			
		||||
auto ipc_json_handler_no_arg_funcs = create_ipc_json_handler_no_arg_func_map ();
 | 
			
		||||
| 
						 | 
				
			
			@ -3862,7 +3862,7 @@ void nano::json_handler::stats ()
 | 
			
		|||
	}
 | 
			
		||||
	else if (type == "objects")
 | 
			
		||||
	{
 | 
			
		||||
		construct_json (collect_seq_con_info (node, "node").get (), response_l);
 | 
			
		||||
		construct_json (collect_container_info (node, "node").get (), response_l);
 | 
			
		||||
	}
 | 
			
		||||
	else if (type == "samples")
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -4942,12 +4942,12 @@ void nano::json_handler::work_peers_clear ()
 | 
			
		|||
 | 
			
		||||
namespace
 | 
			
		||||
{
 | 
			
		||||
void construct_json (nano::seq_con_info_component * component, boost::property_tree::ptree & parent)
 | 
			
		||||
void construct_json (nano::container_info_component * component, boost::property_tree::ptree & parent)
 | 
			
		||||
{
 | 
			
		||||
	// We are a leaf node, print name and exit
 | 
			
		||||
	if (!component->is_composite ())
 | 
			
		||||
	{
 | 
			
		||||
		auto & leaf_info = static_cast<nano::seq_con_info_leaf *> (component)->get_info ();
 | 
			
		||||
		auto & leaf_info = static_cast<nano::container_info_leaf *> (component)->get_info ();
 | 
			
		||||
		boost::property_tree::ptree child;
 | 
			
		||||
		child.put ("count", leaf_info.count);
 | 
			
		||||
		child.put ("size", leaf_info.count * leaf_info.sizeof_element);
 | 
			
		||||
| 
						 | 
				
			
			@ -4955,7 +4955,7 @@ void construct_json (nano::seq_con_info_component * component, boost::property_t
 | 
			
		|||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = static_cast<nano::seq_con_info_composite *> (component);
 | 
			
		||||
	auto composite = static_cast<nano::container_info_composite *> (component);
 | 
			
		||||
 | 
			
		||||
	boost::property_tree::ptree current;
 | 
			
		||||
	for (auto & child : composite->get_children ())
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -968,17 +968,26 @@ void nano::syn_cookies::purge (std::chrono::steady_clock::time_point const & cut
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::seq_con_info_component> nano::syn_cookies::collect_seq_con_info (std::string const & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (network & network, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t syn_cookies_count = 0;
 | 
			
		||||
	size_t syn_cookies_per_ip_count = 0;
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (network.tcp_channels.collect_container_info ("tcp_channels"));
 | 
			
		||||
	composite->add_component (network.udp_channels.collect_container_info ("udp_channels"));
 | 
			
		||||
	composite->add_component (network.syn_cookies.collect_container_info ("syn_cookies"));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::syn_cookies::collect_container_info (std::string const & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t syn_cookies_count;
 | 
			
		||||
	size_t syn_cookies_per_ip_count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> syn_cookie_guard (syn_cookie_mutex);
 | 
			
		||||
		syn_cookies_count = cookies.size ();
 | 
			
		||||
		syn_cookies_per_ip_count = cookies_per_ip.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "syn_cookies", syn_cookies_count, sizeof (decltype (cookies)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "syn_cookies_per_ip", syn_cookies_per_ip_count, sizeof (decltype (cookies_per_ip)::value_type) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "syn_cookies", syn_cookies_count, sizeof (decltype (cookies)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "syn_cookies_per_ip", syn_cookies_per_ip_count, sizeof (decltype (cookies_per_ip)::value_type) }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -78,7 +78,7 @@ public:
 | 
			
		|||
	// Returns false if valid, true if invalid (true on error convention)
 | 
			
		||||
	// Also removes the syn cookie from the store if valid
 | 
			
		||||
	bool validate (nano::endpoint const &, nano::account const &, nano::signature const &);
 | 
			
		||||
	std::unique_ptr<seq_con_info_component> collect_seq_con_info (std::string const &);
 | 
			
		||||
	std::unique_ptr<container_info_component> collect_container_info (std::string const &);
 | 
			
		||||
 | 
			
		||||
private:
 | 
			
		||||
	class syn_cookie_info final
 | 
			
		||||
| 
						 | 
				
			
			@ -167,4 +167,5 @@ public:
 | 
			
		|||
	static size_t const buffer_size = 512;
 | 
			
		||||
	static size_t const confirm_req_hashes_max = 7;
 | 
			
		||||
};
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (network & network, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -64,28 +64,26 @@ void nano::node::keepalive (std::string const & address_a, uint16_t port_a)
 | 
			
		|||
	});
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (rep_crawler & rep_crawler, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (rep_crawler & rep_crawler, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (rep_crawler.active_mutex);
 | 
			
		||||
		count = rep_crawler.active.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (rep_crawler.active)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "active", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "active", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_processor & block_processor, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (block_processor & block_processor, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t state_blocks_count = 0;
 | 
			
		||||
	size_t blocks_count = 0;
 | 
			
		||||
	size_t blocks_filter_count = 0;
 | 
			
		||||
	size_t forced_count = 0;
 | 
			
		||||
	size_t state_blocks_count;
 | 
			
		||||
	size_t blocks_count;
 | 
			
		||||
	size_t blocks_filter_count;
 | 
			
		||||
	size_t forced_count;
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (block_processor.mutex);
 | 
			
		||||
| 
						 | 
				
			
			@ -95,15 +93,14 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_processor &
 | 
			
		|||
		forced_count = block_processor.forced.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "state_blocks", state_blocks_count, sizeof (decltype (block_processor.state_blocks)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "blocks", blocks_count, sizeof (decltype (block_processor.blocks)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "blocks_filter", blocks_filter_count, sizeof (decltype (block_processor.blocks_filter)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "forced", forced_count, sizeof (decltype (block_processor.forced)::value_type) }));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (block_processor.generator, "generator"));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "state_blocks", state_blocks_count, sizeof (decltype (block_processor.state_blocks)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocks", blocks_count, sizeof (decltype (block_processor.blocks)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocks_filter", blocks_filter_count, sizeof (decltype (block_processor.blocks_filter)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "forced", forced_count, sizeof (decltype (block_processor.forced)::value_type) }));
 | 
			
		||||
	composite->add_component (collect_container_info (block_processor.generator, "generator"));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::node::node (boost::asio::io_context & io_ctx_a, uint16_t peering_port_a, boost::filesystem::path const & application_path_a, nano::alarm & alarm_a, nano::logging const & logging_a, nano::work_pool & work_a, nano::node_flags flags_a) :
 | 
			
		||||
node (io_ctx_a, application_path_a, alarm_a, nano::node_config (peering_port_a, logging_a), work_a, flags_a)
 | 
			
		||||
| 
						 | 
				
			
			@ -588,38 +585,33 @@ void nano::node::process_fork (nano::transaction const & transaction_a, std::sha
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (node & node, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (node & node, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.alarm, "alarm"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.work, "work"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.gap_cache, "gap_cache"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.ledger, "ledger"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.active, "active"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.bootstrap_initiator, "bootstrap_initiator"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.bootstrap, "bootstrap"));
 | 
			
		||||
	composite->add_component (node.network.tcp_channels.collect_seq_con_info ("tcp_channels"));
 | 
			
		||||
	composite->add_component (node.network.udp_channels.collect_seq_con_info ("udp_channels"));
 | 
			
		||||
	composite->add_component (node.network.syn_cookies.collect_seq_con_info ("syn_cookies"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.observers, "observers"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.wallets, "wallets"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.vote_processor, "vote_processor"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.rep_crawler, "rep_crawler"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.block_processor, "block_processor"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.block_arrival, "block_arrival"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.online_reps, "online_reps"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.votes_cache, "votes_cache"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.block_uniquer, "block_uniquer"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.vote_uniquer, "vote_uniquer"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.confirmation_height_processor, "confirmation_height_processor"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.pending_confirmation_height, "pending_confirmation_height"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.worker, "worker"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node.distributed_work, "distributed_work"));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (collect_container_info (node.alarm, "alarm"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.work, "work"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.gap_cache, "gap_cache"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.ledger, "ledger"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.active, "active"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.bootstrap_initiator, "bootstrap_initiator"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.bootstrap, "bootstrap"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.network, "network"));  
 | 
			
		||||
	composite->add_component (collect_container_info (node.observers, "observers"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.wallets, "wallets"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.vote_processor, "vote_processor"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.rep_crawler, "rep_crawler"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.block_processor, "block_processor"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.block_arrival, "block_arrival"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.online_reps, "online_reps"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.votes_cache, "votes_cache"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.block_uniquer, "block_uniquer"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.vote_uniquer, "vote_uniquer"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.confirmation_height_processor, "confirmation_height_processor"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.pending_confirmation_height, "pending_confirmation_height"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.worker, "worker"));
 | 
			
		||||
	composite->add_component (collect_container_info (node.distributed_work, "distributed_work"));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void nano::node::process_active (std::shared_ptr<nano::block> incoming)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -1261,9 +1253,7 @@ bool nano::block_arrival::recent (nano::block_hash const & hash_a)
 | 
			
		|||
	return arrival.get<tag_hash> ().find (hash_a) != arrival.get<tag_hash> ().end ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_arrival & block_arrival, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (block_arrival & block_arrival, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	{
 | 
			
		||||
| 
						 | 
				
			
			@ -1272,11 +1262,10 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_arrival & bl
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (block_arrival.arrival)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "arrival", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "arrival", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::shared_ptr<nano::node> nano::node::shared ()
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -77,10 +77,10 @@ public:
 | 
			
		|||
	static std::chrono::seconds constexpr arrival_time_min = std::chrono::seconds (300);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_arrival & block_arrival, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (block_arrival & block_arrival, const std::string & name);
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (rep_crawler & rep_crawler, const std::string & name);
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (block_processor & block_processor, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (rep_crawler & rep_crawler, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (block_processor & block_processor, const std::string & name);
 | 
			
		||||
 | 
			
		||||
class node final : public std::enable_shared_from_this<nano::node>
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +194,7 @@ public:
 | 
			
		|||
	static double constexpr free_cutoff = 1024.0;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (node & node, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (node & node, const std::string & name);
 | 
			
		||||
 | 
			
		||||
nano::node_flags const & inactive_node_flag_defaults ();
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,15 +1,15 @@
 | 
			
		|||
#include <nano/node/node_observers.hpp>
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::seq_con_info_component> nano::collect_seq_con_info (nano::node_observers & node_observers, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (nano::node_observers & node_observers, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto composite = std::make_unique<nano::seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.blocks, "blocks"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.wallet, "wallet"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.vote, "vote"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.active_stopped, "active_stopped"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.account_balance, "account_balance"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.endpoint, "endpoint"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.disconnect, "disconnect"));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (node_observers.work_cancel, "work_cancel"));
 | 
			
		||||
	auto composite = std::make_unique<nano::container_info_composite> (name);
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.blocks, "blocks"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.wallet, "wallet"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.vote, "vote"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.active_stopped, "active_stopped"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.account_balance, "account_balance"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.endpoint, "endpoint"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.disconnect, "disconnect"));
 | 
			
		||||
	composite->add_component (collect_container_info (node_observers.work_cancel, "work_cancel"));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -22,5 +22,5 @@ public:
 | 
			
		|||
	nano::observer_set<nano::root const &> work_cancel;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (node_observers & node_observers, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (node_observers & node_observers, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -86,19 +86,16 @@ std::vector<nano::account> nano::online_reps::list ()
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (online_reps & online_reps, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (online_reps & online_reps, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t count = 0;
 | 
			
		||||
	size_t count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (online_reps.mutex);
 | 
			
		||||
		count = online_reps.reps.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (online_reps.reps)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "arrival", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "arrival", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -36,8 +36,8 @@ private:
 | 
			
		|||
	nano::uint128_t online;
 | 
			
		||||
	nano::uint128_t minimum;
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (online_reps & online_reps, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (online_reps & online_reps, const std::string & name);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (online_reps & online_reps, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (online_reps & online_reps, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -52,7 +52,7 @@ public:
 | 
			
		|||
 */
 | 
			
		||||
class rep_crawler
 | 
			
		||||
{
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (rep_crawler & rep_crawler, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (rep_crawler & rep_crawler, const std::string & name);
 | 
			
		||||
 | 
			
		||||
	// clang-format off
 | 
			
		||||
	class tag_account {};
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -368,11 +368,11 @@ bool nano::transport::tcp_channels::reachout (nano::endpoint const & endpoint_a)
 | 
			
		|||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::seq_con_info_component> nano::transport::tcp_channels::collect_seq_con_info (std::string const & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::transport::tcp_channels::collect_container_info (std::string const & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t channels_count = 0;
 | 
			
		||||
	size_t attemps_count = 0;
 | 
			
		||||
	size_t node_id_handshake_sockets_count = 0;
 | 
			
		||||
	size_t channels_count;
 | 
			
		||||
	size_t attemps_count;
 | 
			
		||||
	size_t node_id_handshake_sockets_count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (mutex);
 | 
			
		||||
		channels_count = channels.size ();
 | 
			
		||||
| 
						 | 
				
			
			@ -380,10 +380,10 @@ std::unique_ptr<nano::seq_con_info_component> nano::transport::tcp_channels::col
 | 
			
		|||
		node_id_handshake_sockets_count = node_id_handshake_sockets.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "channels", channels_count, sizeof (decltype (channels)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "attempts", attemps_count, sizeof (decltype (attempts)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "node_id_handshake_sockets", node_id_handshake_sockets_count, sizeof (decltype (node_id_handshake_sockets)::value_type) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "channels", channels_count, sizeof (decltype (channels)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "attempts", attemps_count, sizeof (decltype (attempts)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "node_id_handshake_sockets", node_id_handshake_sockets_count, sizeof (decltype (node_id_handshake_sockets)::value_type) }));
 | 
			
		||||
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -97,7 +97,7 @@ namespace transport
 | 
			
		|||
		bool max_ip_connections (nano::tcp_endpoint const &);
 | 
			
		||||
		// Should we reach out to this endpoint with a keepalive message
 | 
			
		||||
		bool reachout (nano::endpoint const &);
 | 
			
		||||
		std::unique_ptr<seq_con_info_component> collect_seq_con_info (std::string const &);
 | 
			
		||||
		std::unique_ptr<container_info_component> collect_container_info (std::string const &);
 | 
			
		||||
		void purge (std::chrono::steady_clock::time_point const &);
 | 
			
		||||
		void ongoing_keepalive ();
 | 
			
		||||
		void list (std::deque<std::shared_ptr<nano::transport::channel>> &);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -605,19 +605,19 @@ bool nano::transport::udp_channels::reachout (nano::endpoint const & endpoint_a)
 | 
			
		|||
	return error;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<nano::seq_con_info_component> nano::transport::udp_channels::collect_seq_con_info (std::string const & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::transport::udp_channels::collect_container_info (std::string const & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t channels_count = 0;
 | 
			
		||||
	size_t attemps_count = 0;
 | 
			
		||||
	size_t channels_count;
 | 
			
		||||
	size_t attemps_count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (mutex);
 | 
			
		||||
		channels_count = channels.size ();
 | 
			
		||||
		attemps_count = attempts.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "channels", channels_count, sizeof (decltype (channels)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "attempts", attemps_count, sizeof (decltype (attempts)::value_type) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "channels", channels_count, sizeof (decltype (channels)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "attempts", attemps_count, sizeof (decltype (attempts)::value_type) }));
 | 
			
		||||
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -87,7 +87,7 @@ namespace transport
 | 
			
		|||
		bool max_ip_connections (nano::endpoint const &);
 | 
			
		||||
		// Should we reach out to this endpoint with a keepalive message
 | 
			
		||||
		bool reachout (nano::endpoint const &);
 | 
			
		||||
		std::unique_ptr<seq_con_info_component> collect_seq_con_info (std::string const &);
 | 
			
		||||
		std::unique_ptr<container_info_component> collect_container_info (std::string const &);
 | 
			
		||||
		void purge (std::chrono::steady_clock::time_point const &);
 | 
			
		||||
		void ongoing_keepalive ();
 | 
			
		||||
		void list (std::deque<std::shared_ptr<nano::transport::channel>> &);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -302,14 +302,12 @@ void nano::vote_processor::calculate_weights ()
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (vote_processor & vote_processor, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_processor & vote_processor, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t votes_count = 0;
 | 
			
		||||
	size_t representatives_1_count = 0;
 | 
			
		||||
	size_t representatives_2_count = 0;
 | 
			
		||||
	size_t representatives_3_count = 0;
 | 
			
		||||
	size_t votes_count;
 | 
			
		||||
	size_t representatives_1_count;
 | 
			
		||||
	size_t representatives_2_count;
 | 
			
		||||
	size_t representatives_3_count;
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (vote_processor.mutex);
 | 
			
		||||
| 
						 | 
				
			
			@ -319,11 +317,10 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_processor & v
 | 
			
		|||
		representatives_3_count = vote_processor.representatives_3.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "votes", votes_count, sizeof (decltype (vote_processor.votes)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "representatives_1", representatives_1_count, sizeof (decltype (vote_processor.representatives_1)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "representatives_2", representatives_2_count, sizeof (decltype (vote_processor.representatives_2)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "representatives_3", representatives_3_count, sizeof (decltype (vote_processor.representatives_3)::value_type) }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "votes", votes_count, sizeof (decltype (vote_processor.votes)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "representatives_1", representatives_1_count, sizeof (decltype (vote_processor.representatives_1)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "representatives_2", representatives_2_count, sizeof (decltype (vote_processor.representatives_2)::value_type) }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "representatives_3", representatives_3_count, sizeof (decltype (vote_processor.representatives_3)::value_type) }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -67,8 +67,8 @@ private:
 | 
			
		|||
	bool is_active;
 | 
			
		||||
	std::thread thread;
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_processor & vote_processor, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (vote_processor & vote_processor, const std::string & name);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_processor & vote_processor, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (vote_processor & vote_processor, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -161,9 +161,7 @@ void nano::votes_cache::remove (nano::block_hash const & hash_a)
 | 
			
		|||
	cache.get<tag_hash> ().erase (hash_a);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_generator & vote_generator, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (vote_generator & vote_generator, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t hashes_count = 0;
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -172,23 +170,22 @@ std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_generator & v
 | 
			
		|||
		hashes_count = vote_generator.hashes.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (vote_generator.hashes)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "state_blocks", hashes_count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "state_blocks", hashes_count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (votes_cache & votes_cache, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (votes_cache & votes_cache, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t cache_count = 0;
 | 
			
		||||
	size_t cache_count;
 | 
			
		||||
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (votes_cache.cache_mutex);
 | 
			
		||||
		cache_count = votes_cache.cache.size ();
 | 
			
		||||
	}
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (votes_cache.cache)::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	/* This does not currently loop over each element inside the cache to get the sizes of the votes inside cached_votes */
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "cache", cache_count, sizeof_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "cache", cache_count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -49,10 +49,10 @@ private:
 | 
			
		|||
	bool started{ false };
 | 
			
		||||
	std::thread thread;
 | 
			
		||||
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_generator & vote_generator, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (vote_generator & vote_generator, const std::string & name);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_generator & vote_generator, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (vote_generator & vote_generator, const std::string & name);
 | 
			
		||||
class cached_votes final
 | 
			
		||||
{
 | 
			
		||||
public:
 | 
			
		||||
| 
						 | 
				
			
			@ -79,8 +79,8 @@ private:
 | 
			
		|||
	cache;
 | 
			
		||||
	// clang-format on
 | 
			
		||||
	nano::network_params network_params;
 | 
			
		||||
	friend std::unique_ptr<seq_con_info_component> collect_seq_con_info (votes_cache & votes_cache, const std::string & name);
 | 
			
		||||
	friend std::unique_ptr<container_info_component> collect_container_info (votes_cache & votes_cache, const std::string & name);
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (votes_cache & votes_cache, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (votes_cache & votes_cache, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -2026,25 +2026,22 @@ MDB_txn * nano::wallet_store::tx (nano::transaction const & transaction_a) const
 | 
			
		|||
	return static_cast<MDB_txn *> (transaction_a.get_handle ());
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (wallets & wallets, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (wallets & wallets, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	size_t items_count = 0;
 | 
			
		||||
	size_t actions_count = 0;
 | 
			
		||||
	size_t items_count;
 | 
			
		||||
	size_t actions_count;
 | 
			
		||||
	{
 | 
			
		||||
		nano::lock_guard<std::mutex> guard (wallets.mutex);
 | 
			
		||||
		items_count = wallets.items.size ();
 | 
			
		||||
		actions_count = wallets.actions.size ();
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	auto sizeof_item_element = sizeof (decltype (wallets.items)::value_type);
 | 
			
		||||
	auto sizeof_actions_element = sizeof (decltype (wallets.actions)::value_type);
 | 
			
		||||
	auto sizeof_watcher_element = sizeof (decltype (wallets.watcher->watched)::value_type);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "items", items_count, sizeof_item_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "actions", actions_count, sizeof_actions_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "work_watcher", wallets.watcher->size (), sizeof_watcher_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "items", items_count, sizeof_item_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "actions", actions_count, sizeof_actions_element }));
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "work_watcher", wallets.watcher->size (), sizeof_watcher_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -242,7 +242,7 @@ private:
 | 
			
		|||
	nano::wallet_representative_counts counts;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (wallets & wallets, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (wallets & wallets, const std::string & name);
 | 
			
		||||
 | 
			
		||||
class wallets_store
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -995,9 +995,10 @@ TEST (rpc, wallet_create_seed)
 | 
			
		|||
	request.put ("action", "wallet_create");
 | 
			
		||||
	request.put ("seed", seed.data.to_string ());
 | 
			
		||||
	test_response response (request, rpc.config.port, system.io_ctx);
 | 
			
		||||
	system.deadline_set (10s);
 | 
			
		||||
	while (response.status == 0)
 | 
			
		||||
	{
 | 
			
		||||
		system.poll ();
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_EQ (200, response.status);
 | 
			
		||||
	std::string wallet_text (response.json.get<std::string> ("wallet"));
 | 
			
		||||
| 
						 | 
				
			
			@ -4913,9 +4914,10 @@ TEST (rpc, json_block_input)
 | 
			
		|||
	send.serialize_json (json);
 | 
			
		||||
	request.add_child ("block", json);
 | 
			
		||||
	test_response response (request, rpc.config.port, system.io_ctx);
 | 
			
		||||
	system.deadline_set (10s);
 | 
			
		||||
	while (response.status == 0)
 | 
			
		||||
	{
 | 
			
		||||
		system.poll ();
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_EQ (200, response.status);
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -6733,18 +6735,20 @@ TEST (rpc, sign_hash)
 | 
			
		|||
	request.put ("hash", send.hash ().to_string ());
 | 
			
		||||
	request.put ("key", key.prv.data.to_string ());
 | 
			
		||||
	test_response response (request, rpc.config.port, system.io_ctx);
 | 
			
		||||
	system.deadline_set (10s);
 | 
			
		||||
	while (response.status == 0)
 | 
			
		||||
	{
 | 
			
		||||
		system.poll ();
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_EQ (200, response.status);
 | 
			
		||||
	std::error_code ec (nano::error_rpc::sign_hash_disabled);
 | 
			
		||||
	ASSERT_EQ (response.json.get<std::string> ("error"), ec.message ());
 | 
			
		||||
	node_rpc_config.enable_sign_hash = true;
 | 
			
		||||
	test_response response2 (request, rpc.config.port, system.io_ctx);
 | 
			
		||||
	system.deadline_set (10s);
 | 
			
		||||
	while (response2.status == 0)
 | 
			
		||||
	{
 | 
			
		||||
		system.poll ();
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_EQ (200, response2.status);
 | 
			
		||||
	nano::signature signature;
 | 
			
		||||
| 
						 | 
				
			
			@ -6778,9 +6782,10 @@ TEST (rpc, sign_block)
 | 
			
		|||
	send.serialize_json (json);
 | 
			
		||||
	request.put ("block", json);
 | 
			
		||||
	test_response response (request, rpc.config.port, system.io_ctx);
 | 
			
		||||
	system.deadline_set (10s);
 | 
			
		||||
	while (response.status == 0)
 | 
			
		||||
	{
 | 
			
		||||
		system.poll ();
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_EQ (200, response.status);
 | 
			
		||||
	auto contents (response.json.get<std::string> ("block"));
 | 
			
		||||
| 
						 | 
				
			
			@ -6856,7 +6861,7 @@ TEST (rpc, block_confirmed)
 | 
			
		|||
	system.deadline_set (5s);
 | 
			
		||||
	while (response1.status == 0)
 | 
			
		||||
	{
 | 
			
		||||
		system.poll ();
 | 
			
		||||
		ASSERT_NO_ERROR (system.poll ());
 | 
			
		||||
	}
 | 
			
		||||
	ASSERT_EQ (200, response1.status);
 | 
			
		||||
	ASSERT_EQ (std::error_code (nano::error_blocks::not_found).message (), response1.json.get<std::string> ("error"));
 | 
			
		||||
| 
						 | 
				
			
			@ -6925,9 +6930,15 @@ TEST (rpc, block_confirmed)
 | 
			
		|||
	ASSERT_TRUE (response3.json.get<bool> ("confirmed"));
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#if !NANO_ROCKSDB
 | 
			
		||||
TEST (rpc, database_txn_tracker)
 | 
			
		||||
{
 | 
			
		||||
	// Don't test this in rocksdb mode
 | 
			
		||||
	auto use_rocksdb_str = std::getenv ("TEST_USE_ROCKSDB");
 | 
			
		||||
	if (use_rocksdb_str && boost::lexical_cast<int> (use_rocksdb_str) == 1)
 | 
			
		||||
	{
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// First try when database tracking is disabled
 | 
			
		||||
	{
 | 
			
		||||
		nano::system system;
 | 
			
		||||
| 
						 | 
				
			
			@ -7053,7 +7064,6 @@ TEST (rpc, database_txn_tracker)
 | 
			
		|||
	ASSERT_TRUE (!std::get<3> (json_l.front ()).empty ());
 | 
			
		||||
	thread.join ();
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
TEST (rpc, active_difficulty)
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -757,17 +757,14 @@ size_t nano::vote_uniquer::size ()
 | 
			
		|||
	return votes.size ();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_uniquer & vote_uniquer, const std::string & name)
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (vote_uniquer & vote_uniquer, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto count = vote_uniquer.size ();
 | 
			
		||||
	auto sizeof_element = sizeof (vote_uniquer::value_type);
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "votes", count, sizeof_element }));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "votes", count, sizeof_element }));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
nano::genesis::genesis ()
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -276,7 +276,7 @@ private:
 | 
			
		|||
	static unsigned constexpr cleanup_count = 2;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (vote_uniquer & vote_uniquer, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (vote_uniquer & vote_uniquer, const std::string & name);
 | 
			
		||||
 | 
			
		||||
enum class vote_code
 | 
			
		||||
{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1135,15 +1135,12 @@ bool nano::ledger::block_not_confirmed_or_not_exists (nano::block const & block_
 | 
			
		|||
	return result;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
namespace nano
 | 
			
		||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (ledger & ledger, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (ledger & ledger, const std::string & name)
 | 
			
		||||
{
 | 
			
		||||
	auto composite = std::make_unique<seq_con_info_composite> (name);
 | 
			
		||||
	auto count = ledger.bootstrap_weights_size.load ();
 | 
			
		||||
	auto sizeof_element = sizeof (decltype (ledger.bootstrap_weights)::value_type);
 | 
			
		||||
	composite->add_component (std::make_unique<seq_con_info_leaf> (seq_con_info{ "bootstrap_weights", count, sizeof_element }));
 | 
			
		||||
	composite->add_component (collect_seq_con_info (ledger.cache.rep_weights, "rep_weights"));
 | 
			
		||||
	auto composite = std::make_unique<container_info_composite> (name);
 | 
			
		||||
	composite->add_component (std::make_unique<container_info_leaf> (container_info{ "bootstrap_weights", count, sizeof_element }));
 | 
			
		||||
	composite->add_component (collect_container_info (ledger.cache.rep_weights, "rep_weights"));
 | 
			
		||||
	return composite;
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -58,5 +58,5 @@ public:
 | 
			
		|||
	std::atomic<bool> check_bootstrap_weights;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
std::unique_ptr<seq_con_info_component> collect_seq_con_info (ledger & ledger, const std::string & name);
 | 
			
		||||
std::unique_ptr<container_info_component> collect_container_info (ledger & ledger, const std::string & name);
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue