Rework collect_container_info (..)
functions (#4736)
* Move container info classes to separate file * Introduce better `container_info` class * Rename legacy to `container_info_entry` * Conversion * Test * Fixes
This commit is contained in:
parent
1f1c8abc21
commit
ab093d58d6
92 changed files with 742 additions and 701 deletions
|
@ -3794,4 +3794,25 @@ TEST (node, local_block_broadcast)
|
|||
node1.network.merge_peer (node2.network.endpoint ());
|
||||
ASSERT_TIMELY (5s, node1.network.find_node_id (node2.get_node_id ()));
|
||||
ASSERT_TIMELY (10s, node2.block (send1->hash ()));
|
||||
}
|
||||
|
||||
TEST (node, container_info)
|
||||
{
|
||||
nano::test::system system;
|
||||
auto & node1 = *system.add_node ();
|
||||
auto & node2 = *system.add_node ();
|
||||
|
||||
// Generate some random activity
|
||||
std::vector<nano::account> accounts;
|
||||
auto dev_genesis_key = nano::dev::genesis_key;
|
||||
system.wallet (0)->insert_adhoc (dev_genesis_key.prv);
|
||||
accounts.push_back (dev_genesis_key.pub);
|
||||
for (int n = 0; n < 10; ++n)
|
||||
{
|
||||
system.generate_activity (node1, accounts);
|
||||
}
|
||||
|
||||
// This should just execute, sanitizers will catch any problems
|
||||
ASSERT_NO_THROW (node1.container_info ());
|
||||
ASSERT_NO_THROW (node2.container_info ());
|
||||
}
|
|
@ -36,6 +36,8 @@ add_library(
|
|||
config.hpp
|
||||
config.cpp
|
||||
configbase.hpp
|
||||
container_info.hpp
|
||||
container_info.cpp
|
||||
diagnosticsconfig.hpp
|
||||
diagnosticsconfig.cpp
|
||||
env.hpp
|
||||
|
|
41
nano/lib/container_info.cpp
Normal file
41
nano/lib/container_info.cpp
Normal file
|
@ -0,0 +1,41 @@
|
|||
#include <nano/lib/container_info.hpp>
|
||||
|
||||
nano::container_info_composite::container_info_composite (std::string name) :
|
||||
name (std::move (name))
|
||||
{
|
||||
}
|
||||
|
||||
bool nano::container_info_composite::is_composite () const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void nano::container_info_composite::add_component (std::unique_ptr<container_info_component> child)
|
||||
{
|
||||
children.push_back (std::move (child));
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<nano::container_info_component>> const & nano::container_info_composite::get_children () const
|
||||
{
|
||||
return children;
|
||||
}
|
||||
|
||||
std::string const & nano::container_info_composite::get_name () const
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
nano::container_info_leaf::container_info_leaf (container_info_entry info) :
|
||||
info (std::move (info))
|
||||
{
|
||||
}
|
||||
|
||||
bool nano::container_info_leaf::is_composite () const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
nano::container_info_entry const & nano::container_info_leaf::get_info () const
|
||||
{
|
||||
return info;
|
||||
}
|
172
nano/lib/container_info.hpp
Normal file
172
nano/lib/container_info.hpp
Normal file
|
@ -0,0 +1,172 @@
|
|||
#pragma once
|
||||
|
||||
#include <list>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
/* These containers are used to collect information about sequence containers.
|
||||
* It makes use of the composite design pattern to collect information
|
||||
* from sequence containers and sequence containers inside member variables.
|
||||
*/
|
||||
struct container_info_entry
|
||||
{
|
||||
std::string name;
|
||||
size_t count;
|
||||
size_t sizeof_element;
|
||||
};
|
||||
|
||||
class container_info_component
|
||||
{
|
||||
public:
|
||||
virtual ~container_info_component () = default;
|
||||
virtual bool is_composite () const = 0;
|
||||
};
|
||||
|
||||
class container_info_composite : public container_info_component
|
||||
{
|
||||
public:
|
||||
container_info_composite (std::string name);
|
||||
bool is_composite () const override;
|
||||
void add_component (std::unique_ptr<container_info_component> child);
|
||||
std::vector<std::unique_ptr<container_info_component>> const & get_children () const;
|
||||
std::string const & get_name () const;
|
||||
|
||||
private:
|
||||
std::string name;
|
||||
std::vector<std::unique_ptr<container_info_component>> children;
|
||||
};
|
||||
|
||||
class container_info_leaf : public container_info_component
|
||||
{
|
||||
public:
|
||||
container_info_leaf (container_info_entry);
|
||||
bool is_composite () const override;
|
||||
container_info_entry const & get_info () const;
|
||||
|
||||
private:
|
||||
container_info_entry info;
|
||||
};
|
||||
}
|
||||
|
||||
/*
|
||||
* New version
|
||||
*/
|
||||
namespace nano
|
||||
{
|
||||
class container_info;
|
||||
|
||||
template <typename T>
|
||||
concept sized_container = requires (T a) {
|
||||
typename T::value_type;
|
||||
{
|
||||
a.size ()
|
||||
} -> std::convertible_to<std::size_t>;
|
||||
};
|
||||
|
||||
template <typename T>
|
||||
concept container_info_collectable = requires (T a) {
|
||||
{
|
||||
a.collect_info ()
|
||||
} -> std::convertible_to<container_info>;
|
||||
};
|
||||
|
||||
class container_info
|
||||
{
|
||||
public:
|
||||
// Child represented as <name, container_info>
|
||||
// Using pair to avoid problems with incomplete types
|
||||
using child = std::pair<std::string, container_info>;
|
||||
|
||||
struct entry
|
||||
{
|
||||
std::string name;
|
||||
std::size_t size;
|
||||
std::size_t sizeof_element;
|
||||
};
|
||||
|
||||
public:
|
||||
/**
|
||||
* Adds a subcontainer
|
||||
*/
|
||||
void add (std::string const & name, container_info const & info)
|
||||
{
|
||||
children_m.emplace_back (name, info);
|
||||
}
|
||||
|
||||
template <container_info_collectable T>
|
||||
void add (std::string const & name, T const & container)
|
||||
{
|
||||
add (name, container.collect_info ());
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds an entry to this container
|
||||
*/
|
||||
void put (std::string const & name, std::size_t size, std::size_t sizeof_element = 0)
|
||||
{
|
||||
entries_m.emplace_back (entry{ name, size, sizeof_element });
|
||||
}
|
||||
|
||||
template <class T>
|
||||
void put (std::string const & name, std::size_t size)
|
||||
{
|
||||
put (name, size, sizeof (T));
|
||||
}
|
||||
|
||||
template <sized_container T>
|
||||
void put (std::string const & name, T const & container)
|
||||
{
|
||||
put (name, container.size (), sizeof (typename T::value_type));
|
||||
}
|
||||
|
||||
public:
|
||||
bool children_empty () const
|
||||
{
|
||||
return children_m.empty ();
|
||||
}
|
||||
|
||||
auto const & children () const
|
||||
{
|
||||
return children_m;
|
||||
}
|
||||
|
||||
bool entries_empty () const
|
||||
{
|
||||
return entries_m.empty ();
|
||||
}
|
||||
|
||||
auto const & entries () const
|
||||
{
|
||||
return entries_m;
|
||||
}
|
||||
|
||||
public:
|
||||
// Needed to convert to legacy container_info_component during transition period
|
||||
std::unique_ptr<nano::container_info_component> to_legacy (std::string const & name) const
|
||||
{
|
||||
auto composite = std::make_unique<nano::container_info_composite> (name);
|
||||
|
||||
// Add entries as leaf components
|
||||
for (const auto & entry : entries_m)
|
||||
{
|
||||
nano::container_info_entry info{ entry.name, entry.size, entry.sizeof_element };
|
||||
composite->add_component (std::make_unique<nano::container_info_leaf> (info));
|
||||
}
|
||||
|
||||
// Recursively convert children to composites and add them
|
||||
for (const auto & [child_name, child] : children_m)
|
||||
{
|
||||
composite->add_component (child.to_legacy (child_name));
|
||||
}
|
||||
|
||||
return composite;
|
||||
}
|
||||
|
||||
private:
|
||||
std::list<child> children_m;
|
||||
std::list<entry> entries_m;
|
||||
};
|
||||
}
|
|
@ -36,15 +36,19 @@ public:
|
|||
return observers.empty ();
|
||||
}
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const
|
||||
size_t size () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
return observers.size ();
|
||||
}
|
||||
|
||||
nano::container_info container_info () const
|
||||
{
|
||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||
auto count = observers.size ();
|
||||
lock.unlock ();
|
||||
auto sizeof_element = sizeof (typename decltype (observers)::value_type);
|
||||
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;
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("observers", observers);
|
||||
return info;
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/container_info.hpp>
|
||||
#include <nano/lib/locks.hpp>
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/lib/stats.hpp>
|
||||
|
@ -107,14 +108,13 @@ public:
|
|||
return queue.size ();
|
||||
}
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const
|
||||
nano::container_info container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "queue", queue.size (), sizeof (typename decltype (queue)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("queue", queue);
|
||||
return info;
|
||||
}
|
||||
|
||||
private:
|
||||
|
|
|
@ -89,9 +89,9 @@ void nano::thread_pool::set_thread_names (nano::thread_role::name thread_name)
|
|||
thread_names_latch.wait ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::thread_pool::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::thread_pool::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "count", num_queued_tasks (), sizeof (std::function<void ()>) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("count", num_queued_tasks ());
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -37,7 +37,7 @@ public:
|
|||
/** Returns the number of tasks which are awaiting execution by the thread pool **/
|
||||
uint64_t num_queued_tasks () const;
|
||||
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
nano::mutex mutex;
|
||||
|
|
|
@ -51,13 +51,13 @@ public:
|
|||
return values.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const
|
||||
nano::container_info container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "cache", values.size (), sizeof (Value) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("cache", values);
|
||||
return info;
|
||||
}
|
||||
|
||||
static std::chrono::milliseconds constexpr cleanup_cutoff{ 500 };
|
||||
|
|
|
@ -63,46 +63,6 @@ void nano::initialize_file_descriptor_limit ()
|
|||
}
|
||||
}
|
||||
|
||||
nano::container_info_composite::container_info_composite (std::string const & name) :
|
||||
name (name)
|
||||
{
|
||||
}
|
||||
|
||||
bool nano::container_info_composite::is_composite () const
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
void nano::container_info_composite::add_component (std::unique_ptr<container_info_component> child)
|
||||
{
|
||||
children.push_back (std::move (child));
|
||||
}
|
||||
|
||||
std::vector<std::unique_ptr<nano::container_info_component>> const & nano::container_info_composite::get_children () const
|
||||
{
|
||||
return children;
|
||||
}
|
||||
|
||||
std::string const & nano::container_info_composite::get_name () const
|
||||
{
|
||||
return name;
|
||||
}
|
||||
|
||||
nano::container_info_leaf::container_info_leaf (const container_info & info) :
|
||||
info (info)
|
||||
{
|
||||
}
|
||||
|
||||
bool nano::container_info_leaf::is_composite () const
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
nano::container_info const & nano::container_info_leaf::get_info () const
|
||||
{
|
||||
return info;
|
||||
}
|
||||
|
||||
void nano::remove_all_files_in_dir (std::filesystem::path const & dir)
|
||||
{
|
||||
for (auto & p : std::filesystem::directory_iterator (dir))
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/container_info.hpp>
|
||||
#include <nano/lib/locks.hpp>
|
||||
|
||||
#include <boost/current_function.hpp>
|
||||
|
@ -55,49 +56,6 @@ namespace program_options
|
|||
|
||||
namespace nano
|
||||
{
|
||||
/* These containers are used to collect information about sequence containers.
|
||||
* It makes use of the composite design pattern to collect information
|
||||
* from sequence containers and sequence containers inside member variables.
|
||||
*/
|
||||
struct container_info
|
||||
{
|
||||
std::string name;
|
||||
size_t count;
|
||||
size_t sizeof_element;
|
||||
};
|
||||
|
||||
class container_info_component
|
||||
{
|
||||
public:
|
||||
virtual ~container_info_component () = default;
|
||||
virtual bool is_composite () const = 0;
|
||||
};
|
||||
|
||||
class container_info_composite : public container_info_component
|
||||
{
|
||||
public:
|
||||
container_info_composite (std::string const & name);
|
||||
bool is_composite () const override;
|
||||
void add_component (std::unique_ptr<container_info_component> child);
|
||||
std::vector<std::unique_ptr<container_info_component>> const & get_children () const;
|
||||
std::string const & get_name () const;
|
||||
|
||||
private:
|
||||
std::string name;
|
||||
std::vector<std::unique_ptr<container_info_component>> children;
|
||||
};
|
||||
|
||||
class container_info_leaf : public container_info_component
|
||||
{
|
||||
public:
|
||||
container_info_leaf (container_info const & info);
|
||||
bool is_composite () const override;
|
||||
container_info const & get_info () const;
|
||||
|
||||
private:
|
||||
container_info info;
|
||||
};
|
||||
|
||||
// Lower priority of calling work generating thread
|
||||
void work_thread_reprioritize ();
|
||||
|
||||
|
|
|
@ -232,16 +232,12 @@ size_t nano::work_pool::size ()
|
|||
return pending.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (work_pool & work_pool, std::string const & name)
|
||||
nano::container_info nano::work_pool::container_info () const
|
||||
{
|
||||
size_t count;
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ work_pool.mutex };
|
||||
count = work_pool.pending.size ();
|
||||
}
|
||||
auto sizeof_element = sizeof (decltype (work_pool.pending)::value_type);
|
||||
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 (work_pool.work_observers.collect_container_info ("work_observers"));
|
||||
return composite;
|
||||
}
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("pending", pending);
|
||||
info.add ("work_observers", work_observers.container_info ());
|
||||
return info;
|
||||
}
|
|
@ -56,12 +56,12 @@ public:
|
|||
bool done;
|
||||
std::vector<boost::thread> threads;
|
||||
std::list<nano::work_item> pending;
|
||||
nano::mutex mutex{ mutex_identifier (mutexes::work_pool) };
|
||||
mutable nano::mutex mutex{ mutex_identifier (mutexes::work_pool) };
|
||||
nano::condition_variable producer_condition;
|
||||
std::chrono::nanoseconds pow_rate_limiter;
|
||||
nano::opencl_work_func_t opencl;
|
||||
nano::observer_set<bool> work_observers;
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (work_pool & work_pool, std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -589,21 +589,21 @@ void nano::active_elections::clear ()
|
|||
vacancy_update ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (active_elections & active_elections, std::string const & name)
|
||||
nano::container_info nano::active_elections::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ active_elections.mutex };
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "roots", active_elections.roots.size (), sizeof (decltype (active_elections.roots)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "election_winner_details", active_elections.election_winner_details_size (), sizeof (decltype (active_elections.election_winner_details)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "normal", static_cast<std::size_t> (active_elections.count_by_behavior[nano::election_behavior::priority]), 0 }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "hinted", static_cast<std::size_t> (active_elections.count_by_behavior[nano::election_behavior::hinted]), 0 }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "optimistic", static_cast<std::size_t> (active_elections.count_by_behavior[nano::election_behavior::optimistic]), 0 }));
|
||||
nano::container_info info;
|
||||
info.put ("roots", roots.size ());
|
||||
info.put ("election_winner_details", election_winner_details_size ());
|
||||
info.put ("normal", static_cast<std::size_t> (count_by_behavior[nano::election_behavior::priority]));
|
||||
info.put ("hinted", static_cast<std::size_t> (count_by_behavior[nano::election_behavior::hinted]));
|
||||
info.put ("optimistic", static_cast<std::size_t> (count_by_behavior[nano::election_behavior::optimistic]));
|
||||
|
||||
composite->add_component (active_elections.recently_confirmed.collect_container_info ("recently_confirmed"));
|
||||
composite->add_component (active_elections.recently_cemented.collect_container_info ("recently_cemented"));
|
||||
info.add ("recently_confirmed", recently_confirmed.container_info ());
|
||||
info.add ("recently_cemented", recently_cemented.container_info ());
|
||||
|
||||
return composite;
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include <nano/node/election_behavior.hpp>
|
||||
#include <nano/node/election_insertion_result.hpp>
|
||||
#include <nano/node/election_status.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/node/recently_cemented_cache.hpp>
|
||||
#include <nano/node/recently_confirmed_cache.hpp>
|
||||
#include <nano/node/vote_router.hpp>
|
||||
|
@ -25,24 +26,6 @@
|
|||
|
||||
namespace mi = boost::multi_index;
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class node;
|
||||
class active_elections;
|
||||
class block;
|
||||
class block_sideband;
|
||||
class block_processor;
|
||||
class confirming_set;
|
||||
class election;
|
||||
class vote;
|
||||
class stats;
|
||||
enum class election_state;
|
||||
}
|
||||
namespace nano::secure
|
||||
{
|
||||
class transaction;
|
||||
}
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class active_elections_config final
|
||||
|
@ -144,6 +127,8 @@ public:
|
|||
void add_election_winner_details (nano::block_hash const &, std::shared_ptr<nano::election> const &);
|
||||
std::shared_ptr<nano::election> remove_election_winner_details (nano::block_hash const &);
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
void request_loop ();
|
||||
void request_confirm (nano::unique_lock<nano::mutex> &);
|
||||
|
@ -164,8 +149,8 @@ private: // Dependencies
|
|||
nano::block_processor & block_processor;
|
||||
|
||||
public:
|
||||
recently_confirmed_cache recently_confirmed;
|
||||
recently_cemented_cache recently_cemented;
|
||||
nano::recently_confirmed_cache recently_confirmed;
|
||||
nano::recently_cemented_cache recently_cemented;
|
||||
|
||||
// TODO: This mutex is currently public because many tests access it
|
||||
// TODO: This is bad. Remove the need to explicitly lock this from any code outside of this class
|
||||
|
@ -186,7 +171,6 @@ private:
|
|||
std::thread thread;
|
||||
|
||||
friend class election;
|
||||
friend std::unique_ptr<container_info_component> collect_container_info (active_elections &, std::string const &);
|
||||
|
||||
public: // Tests
|
||||
void clear ();
|
||||
|
@ -204,8 +188,6 @@ public: // Tests
|
|||
friend class frontiers_confirmation_expired_optimistic_elections_removal_Test;
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (active_elections & active_elections, std::string const & name);
|
||||
|
||||
nano::stat::type to_stat_type (nano::election_state);
|
||||
nano::stat::detail to_stat_detail (nano::election_state);
|
||||
}
|
||||
|
|
|
@ -458,25 +458,15 @@ void nano::block_processor::queue_unchecked (secure::write_transaction const & t
|
|||
node.unchecked.trigger (hash_or_account_a);
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::block_processor::collect_container_info (std::string const & name)
|
||||
nano::container_info nano::block_processor::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocks", queue.size (), 0 }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "forced", queue.size ({ nano::block_source::forced }), 0 }));
|
||||
composite->add_component (queue.collect_container_info ("queue"));
|
||||
return composite;
|
||||
}
|
||||
|
||||
std::string_view nano::to_string (nano::block_source source)
|
||||
{
|
||||
return nano::enum_util::name (source);
|
||||
}
|
||||
|
||||
nano::stat::detail nano::to_stat_detail (nano::block_source type)
|
||||
{
|
||||
return nano::enum_util::cast<nano::stat::detail> (type);
|
||||
nano::container_info info;
|
||||
info.put ("blocks", queue.size ());
|
||||
info.put ("forced", queue.size ({ nano::block_source::forced }));
|
||||
info.add ("queue", queue.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -508,3 +498,17 @@ nano::error nano::block_processor_config::deserialize (nano::tomlconfig & toml)
|
|||
|
||||
return toml.get_error ();
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
std::string_view nano::to_string (nano::block_source source)
|
||||
{
|
||||
return nano::enum_util::name (source);
|
||||
}
|
||||
|
||||
nano::stat::detail nano::to_stat_detail (nano::block_source type)
|
||||
{
|
||||
return nano::enum_util::cast<nano::stat::detail> (type);
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <nano/lib/logging.hpp>
|
||||
#include <nano/node/fair_queue.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/secure/common.hpp>
|
||||
|
||||
#include <chrono>
|
||||
|
@ -10,17 +11,6 @@
|
|||
#include <optional>
|
||||
#include <thread>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class block;
|
||||
class node;
|
||||
}
|
||||
|
||||
namespace nano::secure
|
||||
{
|
||||
class write_transaction;
|
||||
}
|
||||
|
||||
namespace nano
|
||||
{
|
||||
enum class block_source
|
||||
|
@ -101,7 +91,7 @@ public:
|
|||
void force (std::shared_ptr<nano::block> const &);
|
||||
bool should_log ();
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
std::atomic<bool> flushing{ false };
|
||||
|
||||
|
|
|
@ -288,25 +288,18 @@ void nano::bootstrap_initiator::notify_listeners (bool in_progress_a)
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (bootstrap_initiator & bootstrap_initiator, std::string const & name)
|
||||
nano::container_info nano::bootstrap_initiator::container_info () const
|
||||
{
|
||||
std::size_t count;
|
||||
std::size_t cache_count;
|
||||
nano::container_info info;
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ bootstrap_initiator.observers_mutex };
|
||||
count = bootstrap_initiator.observers.size ();
|
||||
nano::lock_guard<nano::mutex> guard{ observers_mutex };
|
||||
info.put ("observers", observers.size ());
|
||||
}
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ bootstrap_initiator.cache.pulls_cache_mutex };
|
||||
cache_count = bootstrap_initiator.cache.cache.size ();
|
||||
nano::lock_guard<nano::mutex> guard{ cache.pulls_cache_mutex };
|
||||
info.put ("pulls_cache", cache.cache.size ());
|
||||
}
|
||||
|
||||
auto sizeof_element = sizeof (decltype (bootstrap_initiator.observers)::value_type);
|
||||
auto sizeof_cache_element = sizeof (decltype (bootstrap_initiator.cache.cache)::value_type);
|
||||
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 }));
|
||||
return composite;
|
||||
return info;
|
||||
}
|
||||
|
||||
void nano::pulls_cache::add (nano::pull_info const & pull_a)
|
||||
|
|
|
@ -53,7 +53,7 @@ public:
|
|||
void add (nano::pull_info const &);
|
||||
void update_pull (nano::pull_info &);
|
||||
void remove (nano::pull_info const &);
|
||||
nano::mutex pulls_cache_mutex;
|
||||
mutable nano::mutex pulls_cache_mutex;
|
||||
class account_head_tag
|
||||
{
|
||||
};
|
||||
|
@ -116,6 +116,7 @@ public:
|
|||
nano::pulls_cache cache;
|
||||
nano::bootstrap_attempts attempts;
|
||||
void stop ();
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
nano::node & node;
|
||||
|
@ -123,17 +124,13 @@ private:
|
|||
void stop_attempts ();
|
||||
std::vector<std::shared_ptr<nano::bootstrap_attempt>> attempts_list;
|
||||
std::atomic<bool> stopped{ false };
|
||||
nano::mutex mutex;
|
||||
mutable nano::mutex mutex;
|
||||
nano::condition_variable condition;
|
||||
nano::mutex observers_mutex;
|
||||
mutable nano::mutex observers_mutex;
|
||||
std::vector<std::function<void (bool)>> observers;
|
||||
std::vector<boost::thread> bootstrap_initiator_threads;
|
||||
|
||||
friend std::unique_ptr<container_info_component> collect_container_info (bootstrap_initiator & bootstrap_initiator, std::string const & name);
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (bootstrap_initiator & bootstrap_initiator, std::string const & name);
|
||||
|
||||
/**
|
||||
* Defines the numeric values for the bootstrap feature.
|
||||
*/
|
||||
|
|
|
@ -344,14 +344,14 @@ auto nano::bootstrap_ascending::account_sets::info () const -> nano::bootstrap_a
|
|||
return { blocking, priorities };
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::bootstrap_ascending::account_sets::collect_container_info (const std::string & name)
|
||||
nano::container_info nano::bootstrap_ascending::account_sets::container_info () const
|
||||
{
|
||||
// Count blocking entries with their dependency account unknown
|
||||
auto blocking_unknown = blocking.get<tag_dependency_account> ().count (nano::account{ 0 });
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "priorities", priorities.size (), sizeof (decltype (priorities)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocking", blocking.size (), sizeof (decltype (blocking)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "blocking_unknown", blocking_unknown, 0 }));
|
||||
return composite;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.put ("priorities", priorities);
|
||||
info.put ("blocking", blocking);
|
||||
info.put ("blocking_unknown", blocking_unknown);
|
||||
return info;
|
||||
}
|
|
@ -62,7 +62,6 @@ namespace bootstrap_ascending
|
|||
nano::account next_priority (std::function<bool (nano::account const &)> const & filter);
|
||||
nano::block_hash next_blocking (std::function<bool (nano::block_hash const &)> const & filter);
|
||||
|
||||
public:
|
||||
bool blocked (nano::account const & account) const;
|
||||
bool prioritized (nano::account const & account) const;
|
||||
// Accounts in the ledger but not in priority list are assumed priority 1.0f
|
||||
|
@ -74,7 +73,7 @@ namespace bootstrap_ascending
|
|||
bool priority_half_full () const;
|
||||
bool blocked_half_full () const;
|
||||
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
account_sets_config const & config;
|
||||
|
|
|
@ -55,12 +55,12 @@ bool nano::bootstrap_ascending::database_scan::warmed_up () const
|
|||
return accounts_iterator.warmed_up () && pending_iterator.warmed_up ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::bootstrap_ascending::database_scan::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::bootstrap_ascending::database_scan::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "accounts_iterator", accounts_iterator.completed, 0 }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "pending_iterator", pending_iterator.completed, 0 }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("accounts_iterator", accounts_iterator.completed);
|
||||
info.put ("pending_iterator", pending_iterator.completed);
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/container_info.hpp>
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/secure/pending_info.hpp>
|
||||
|
@ -42,7 +43,7 @@ public:
|
|||
// Indicates if a full ledger iteration has taken place e.g. warmed up
|
||||
bool warmed_up () const;
|
||||
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
nano::ledger & ledger;
|
||||
|
|
|
@ -830,17 +830,17 @@ std::size_t nano::bootstrap_ascending::service::compute_throttle_size () const
|
|||
return std::max (target, min_size);
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::bootstrap_ascending::service::collect_container_info (std::string const & name)
|
||||
nano::container_info nano::bootstrap_ascending::service::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "tags", tags.size (), sizeof (decltype (tags)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "throttle", throttle.size (), 0 }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "throttle_successes", throttle.successes (), 0 }));
|
||||
composite->add_component (accounts.collect_container_info ("accounts"));
|
||||
composite->add_component (database_scan.collect_container_info ("database_scan"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("tags", tags);
|
||||
info.put ("throttle", throttle.size ());
|
||||
info.put ("throttle_successes", throttle.successes ());
|
||||
info.add ("accounts", accounts.container_info ());
|
||||
info.add ("database_scan", database_scan.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -40,11 +40,12 @@ namespace bootstrap_ascending
|
|||
*/
|
||||
void process (nano::asc_pull_ack const & message, std::shared_ptr<nano::transport::channel> const &);
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name);
|
||||
std::size_t blocked_size () const;
|
||||
std::size_t priority_size () const;
|
||||
std::size_t score_size () const;
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
nano::bootstrap_ascending::account_sets::info_t info () const;
|
||||
|
||||
private: // Dependencies
|
||||
|
|
|
@ -208,12 +208,12 @@ void nano::confirming_set::run_batch (std::unique_lock<std::mutex> & lock)
|
|||
release_assert (already.empty ());
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::confirming_set::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::confirming_set::container_info () const
|
||||
{
|
||||
std::lock_guard guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "set", set.size (), sizeof (typename decltype (set)::value_type) }));
|
||||
composite->add_component (notification_workers.collect_container_info ("notification_workers"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("set", set);
|
||||
info.add ("notification_workers", notification_workers.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -45,7 +45,7 @@ public:
|
|||
bool exists (nano::block_hash const & hash) const;
|
||||
std::size_t size () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public: // Events
|
||||
// Observers will be called once ledger has blocks marked as confirmed
|
||||
|
|
|
@ -80,11 +80,9 @@ std::size_t nano::distributed_work_factory::size () const
|
|||
return items.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (distributed_work_factory & distributed_work, std::string const & name)
|
||||
nano::container_info nano::distributed_work_factory::container_info () const
|
||||
{
|
||||
auto item_count = distributed_work.size ();
|
||||
auto sizeof_item_element = sizeof (decltype (nano::distributed_work_factory::items)::value_type);
|
||||
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;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.put ("items", size ());
|
||||
return info;
|
||||
}
|
|
@ -27,6 +27,7 @@ public:
|
|||
void cleanup_finished ();
|
||||
void stop ();
|
||||
std::size_t size () const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
std::unordered_multimap<nano::root, std::weak_ptr<nano::distributed_work>> items;
|
||||
|
@ -34,9 +35,5 @@ private:
|
|||
nano::node & node;
|
||||
mutable nano::mutex mutex;
|
||||
std::atomic<bool> stopped{ false };
|
||||
|
||||
friend std::unique_ptr<container_info_component> collect_container_info (distributed_work_factory &, std::string const &);
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (distributed_work_factory & distributed_work, std::string const & name);
|
||||
}
|
||||
|
|
|
@ -302,12 +302,12 @@ private:
|
|||
std::chrono::steady_clock::time_point last_update{ std::chrono::steady_clock::now () };
|
||||
|
||||
public:
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const
|
||||
nano::container_info container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "queues", queues_size (), sizeof (typename decltype (queues)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "total_size", size (), sizeof (typename decltype (queues)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("queues", queues);
|
||||
info.put ("total_size", size ());
|
||||
return info;
|
||||
}
|
||||
};
|
||||
}
|
||||
|
|
|
@ -4,12 +4,19 @@
|
|||
#include <nano/secure/fwd.hpp>
|
||||
#include <nano/store/fwd.hpp>
|
||||
|
||||
// TODO: Move to lib/fwd.hpp
|
||||
namespace nano
|
||||
{
|
||||
class block;
|
||||
class container_info;
|
||||
}
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class active_elections;
|
||||
class block;
|
||||
class block_processor;
|
||||
class confirming_set;
|
||||
class election;
|
||||
class ledger;
|
||||
class local_block_broadcaster;
|
||||
class local_vote_history;
|
||||
|
@ -21,6 +28,8 @@ class node_config;
|
|||
class node_flags;
|
||||
class node_observers;
|
||||
class online_reps;
|
||||
class recently_cemented_cache;
|
||||
class recently_confirmed_cache;
|
||||
class rep_crawler;
|
||||
class rep_tiers;
|
||||
class stats;
|
||||
|
@ -28,8 +37,19 @@ class vote_cache;
|
|||
class vote_generator;
|
||||
class vote_processor;
|
||||
class vote_router;
|
||||
class vote_spacing;
|
||||
class wallets;
|
||||
|
||||
enum class block_source;
|
||||
enum class election_behavior;
|
||||
enum class election_state;
|
||||
enum class vote_code;
|
||||
}
|
||||
|
||||
namespace nano::scheduler
|
||||
{
|
||||
class hinted;
|
||||
class manual;
|
||||
class optimistic;
|
||||
class priority;
|
||||
}
|
|
@ -3944,7 +3944,7 @@ void nano::json_handler::stats ()
|
|||
}
|
||||
else if (type == "objects")
|
||||
{
|
||||
construct_json (collect_container_info (node, "node").get (), response_l);
|
||||
construct_json (node.container_info ().to_legacy ("node").get (), response_l);
|
||||
}
|
||||
else if (type == "database")
|
||||
{
|
||||
|
|
|
@ -223,11 +223,11 @@ void nano::local_block_broadcaster::cleanup (nano::unique_lock<nano::mutex> & lo
|
|||
});
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::local_block_broadcaster::collect_container_info (const std::string & name) const
|
||||
nano::container_info nano::local_block_broadcaster::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "local", local_blocks.size (), sizeof (decltype (local_blocks)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("local", local_blocks);
|
||||
return info;
|
||||
}
|
|
@ -60,7 +60,7 @@ public:
|
|||
|
||||
size_t size () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
void run ();
|
||||
|
|
|
@ -104,12 +104,11 @@ std::size_t nano::local_vote_history::size () const
|
|||
return history.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::local_vote_history::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::local_vote_history::container_info () const
|
||||
{
|
||||
std::size_t history_count = size ();
|
||||
auto sizeof_element = sizeof (decltype (history)::value_type);
|
||||
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 history*/
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "history", history_count, sizeof_element }));
|
||||
return composite;
|
||||
}
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("history", history);
|
||||
return info;
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <nano/lib/locks.hpp>
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
#include <boost/multi_index/member.hpp>
|
||||
|
@ -15,8 +16,6 @@ namespace mi = boost::multi_index;
|
|||
|
||||
namespace nano
|
||||
{
|
||||
class container_info_component;
|
||||
class vote;
|
||||
class voting_constants;
|
||||
}
|
||||
|
||||
|
@ -50,7 +49,7 @@ public:
|
|||
bool exists (nano::root const &) const;
|
||||
std::size_t size () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
// clang-format off
|
||||
|
|
|
@ -290,13 +290,13 @@ void nano::message_processor::process (nano::message const & message, std::share
|
|||
message.visit (visitor);
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::message_processor::collect_container_info (std::string const & name)
|
||||
nano::container_info nano::message_processor::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (queue.collect_container_info ("queue"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.add ("queue", queue.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -36,7 +36,7 @@ public:
|
|||
bool put (std::unique_ptr<nano::message>, std::shared_ptr<nano::transport::channel> const &);
|
||||
void process (nano::message const &, std::shared_ptr<nano::transport::channel> const &);
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
void run ();
|
||||
|
@ -53,7 +53,7 @@ private:
|
|||
nano::fair_queue<entry_t, nano::no_value> queue;
|
||||
|
||||
std::atomic<bool> stopped{ false };
|
||||
nano::mutex mutex;
|
||||
mutable nano::mutex mutex;
|
||||
nano::condition_variable condition;
|
||||
std::vector<std::thread> threads;
|
||||
};
|
||||
|
|
|
@ -575,6 +575,15 @@ nano::node_id_handshake::response_payload nano::network::prepare_handshake_respo
|
|||
return response;
|
||||
}
|
||||
|
||||
nano::container_info nano::network::container_info () const
|
||||
{
|
||||
nano::container_info info;
|
||||
info.add ("tcp_channels", tcp_channels.container_info ());
|
||||
info.add ("syn_cookies", syn_cookies.container_info ());
|
||||
info.add ("excluded_peers", excluded_peers.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
* syn_cookies
|
||||
*/
|
||||
|
@ -682,32 +691,18 @@ std::optional<nano::uint256_union> nano::syn_cookies::cookie (const nano::endpoi
|
|||
return std::nullopt;
|
||||
}
|
||||
|
||||
std::size_t nano::syn_cookies::cookies_size ()
|
||||
std::size_t nano::syn_cookies::cookies_size () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ syn_cookie_mutex };
|
||||
return cookies.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (network & network, std::string const & name)
|
||||
nano::container_info nano::syn_cookies::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (network.tcp_channels.collect_container_info ("tcp_channels"));
|
||||
composite->add_component (network.syn_cookies.collect_container_info ("syn_cookies"));
|
||||
composite->add_component (network.excluded_peers.collect_container_info ("excluded_peers"));
|
||||
return composite;
|
||||
}
|
||||
nano::lock_guard<nano::mutex> syn_cookie_guard{ syn_cookie_mutex };
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::syn_cookies::collect_container_info (std::string const & name)
|
||||
{
|
||||
std::size_t syn_cookies_count;
|
||||
std::size_t syn_cookies_per_ip_count;
|
||||
{
|
||||
nano::lock_guard<nano::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<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;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.put ("syn_cookies", cookies.size ());
|
||||
info.put ("syn_cookies_per_ip", cookies_per_ip.size ());
|
||||
return info;
|
||||
}
|
|
@ -34,9 +34,8 @@ public:
|
|||
bool validate (nano::endpoint const &, nano::account const &, nano::signature const &);
|
||||
/** Get cookie associated with endpoint and erases that cookie from this container */
|
||||
std::optional<nano::uint256_union> cookie (nano::endpoint const &);
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const &);
|
||||
std::size_t cookies_size ();
|
||||
std::size_t cookies_size () const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
nano::logger & logger;
|
||||
|
@ -130,6 +129,8 @@ public:
|
|||
void exclude (std::shared_ptr<nano::transport::channel> const & channel);
|
||||
void inbound (nano::message const &, std::shared_ptr<nano::transport::channel> const &);
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public: // Handshake
|
||||
/** Verifies that handshake response matches our query. @returns true if OK */
|
||||
bool verify_handshake_response (nano::node_id_handshake::response_payload const & response, nano::endpoint const & remote_endpoint);
|
||||
|
@ -176,6 +177,4 @@ public:
|
|||
static std::size_t confirm_req_hashes_max;
|
||||
static std::size_t confirm_ack_hashes_max;
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (network & network, std::string const & name);
|
||||
}
|
||||
|
|
|
@ -518,46 +518,6 @@ void nano::node::keepalive (std::string const & address_a, uint16_t port_a)
|
|||
});
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (node & node, std::string const & name)
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (collect_container_info (node.work, "work"));
|
||||
composite->add_component (node.ledger.collect_container_info ("ledger"));
|
||||
composite->add_component (collect_container_info (node.active, "active"));
|
||||
composite->add_component (collect_container_info (node.bootstrap_initiator, "bootstrap_initiator"));
|
||||
composite->add_component (node.tcp_listener.collect_container_info ("tcp_listener"));
|
||||
composite->add_component (collect_container_info (node.network, "network"));
|
||||
composite->add_component (node.telemetry.collect_container_info ("telemetry"));
|
||||
composite->add_component (node.workers.collect_container_info ("workers"));
|
||||
composite->add_component (node.bootstrap_workers.collect_container_info ("bootstrap_workers"));
|
||||
composite->add_component (node.wallet_workers.collect_container_info ("wallet_workers"));
|
||||
composite->add_component (node.election_workers.collect_container_info ("election_workers"));
|
||||
composite->add_component (collect_container_info (node.observers, "observers"));
|
||||
composite->add_component (collect_container_info (node.wallets, "wallets"));
|
||||
composite->add_component (node.vote_processor.collect_container_info ("vote_processor"));
|
||||
composite->add_component (node.vote_cache_processor.collect_container_info ("vote_cache_processor"));
|
||||
composite->add_component (node.rep_crawler.collect_container_info ("rep_crawler"));
|
||||
composite->add_component (node.block_processor.collect_container_info ("block_processor"));
|
||||
composite->add_component (collect_container_info (node.online_reps, "online_reps"));
|
||||
composite->add_component (node.history.collect_container_info ("history"));
|
||||
composite->add_component (node.block_uniquer.collect_container_info ("block_uniquer"));
|
||||
composite->add_component (node.vote_uniquer.collect_container_info ("vote_uniquer"));
|
||||
composite->add_component (node.confirming_set.collect_container_info ("confirming_set"));
|
||||
composite->add_component (collect_container_info (node.distributed_work, "distributed_work"));
|
||||
composite->add_component (node.aggregator.collect_container_info ("request_aggregator"));
|
||||
composite->add_component (node.scheduler.collect_container_info ("election_scheduler"));
|
||||
composite->add_component (node.vote_cache.collect_container_info ("vote_cache"));
|
||||
composite->add_component (node.vote_router.collect_container_info ("vote_router"));
|
||||
composite->add_component (node.generator.collect_container_info ("vote_generator"));
|
||||
composite->add_component (node.final_generator.collect_container_info ("vote_generator_final"));
|
||||
composite->add_component (node.ascendboot.collect_container_info ("bootstrap_ascending"));
|
||||
composite->add_component (node.unchecked.collect_container_info ("unchecked"));
|
||||
composite->add_component (node.local_block_broadcaster.collect_container_info ("local_block_broadcaster"));
|
||||
composite->add_component (node.rep_tiers.collect_container_info ("rep_tiers"));
|
||||
composite->add_component (node.message_processor.collect_container_info ("message_processor"));
|
||||
return composite;
|
||||
}
|
||||
|
||||
void nano::node::process_active (std::shared_ptr<nano::block> const & incoming)
|
||||
{
|
||||
block_processor.add (incoming);
|
||||
|
@ -1305,6 +1265,59 @@ std::string nano::node::make_logger_identifier (const nano::keypair & node_id)
|
|||
return node_id.pub.to_node_id ().substr (0, 10);
|
||||
}
|
||||
|
||||
nano::container_info nano::node::container_info () const
|
||||
{
|
||||
/*
|
||||
* TODO: Add container infos for:
|
||||
* - bootstrap_server
|
||||
* - peer_history
|
||||
* - port_mapping
|
||||
* - epoch_upgrader
|
||||
* - websocket
|
||||
*/
|
||||
|
||||
nano::container_info info;
|
||||
info.add ("work", work.container_info ());
|
||||
info.add ("ledger", ledger.container_info ());
|
||||
info.add ("active", active.container_info ());
|
||||
info.add ("bootstrap_initiator", bootstrap_initiator.container_info ());
|
||||
info.add ("tcp_listener", tcp_listener.container_info ());
|
||||
info.add ("network", network.container_info ());
|
||||
info.add ("telemetry", telemetry.container_info ());
|
||||
info.add ("workers", workers.container_info ());
|
||||
info.add ("bootstrap_workers", bootstrap_workers.container_info ());
|
||||
info.add ("wallet_workers", wallet_workers.container_info ());
|
||||
info.add ("election_workers", election_workers.container_info ());
|
||||
info.add ("observers", observers.container_info ());
|
||||
info.add ("wallets", wallets.container_info ());
|
||||
info.add ("vote_processor", vote_processor.container_info ());
|
||||
info.add ("vote_cache_processor", vote_cache_processor.container_info ());
|
||||
info.add ("rep_crawler", rep_crawler.container_info ());
|
||||
info.add ("block_processor", block_processor.container_info ());
|
||||
info.add ("online_reps", online_reps.container_info ());
|
||||
info.add ("history", history.container_info ());
|
||||
info.add ("block_uniquer", block_uniquer.container_info ());
|
||||
info.add ("vote_uniquer", vote_uniquer.container_info ());
|
||||
info.add ("confirming_set", confirming_set.container_info ());
|
||||
info.add ("distributed_work", distributed_work.container_info ());
|
||||
info.add ("aggregator", aggregator.container_info ());
|
||||
info.add ("scheduler", scheduler.container_info ());
|
||||
info.add ("vote_cache", vote_cache.container_info ());
|
||||
info.add ("vote_router", vote_router.container_info ());
|
||||
info.add ("generator", generator.container_info ());
|
||||
info.add ("final_generator", final_generator.container_info ());
|
||||
info.add ("bootstrap_ascending", ascendboot.container_info ());
|
||||
info.add ("unchecked", unchecked.container_info ());
|
||||
info.add ("local_block_broadcaster", local_block_broadcaster.container_info ());
|
||||
info.add ("rep_tiers", rep_tiers.container_info ());
|
||||
info.add ("message_processor", message_processor.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
*
|
||||
*/
|
||||
|
||||
nano::keypair nano::load_or_create_node_id (std::filesystem::path const & application_path)
|
||||
{
|
||||
auto node_private_key_path = application_path / "node_id_private.key";
|
||||
|
|
|
@ -142,6 +142,7 @@ public:
|
|||
nano::account get_node_id () const;
|
||||
nano::telemetry_data local_telemetry () const;
|
||||
std::string identifier () const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public:
|
||||
const nano::keypair node_id;
|
||||
|
@ -260,8 +261,6 @@ private:
|
|||
|
||||
nano::keypair load_or_create_node_id (std::filesystem::path const & application_path);
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (node & node, std::string const & name);
|
||||
|
||||
nano::node_flags const & inactive_node_flag_defaults ();
|
||||
|
||||
}
|
||||
|
|
|
@ -1,16 +1,18 @@
|
|||
#include <nano/node/node_observers.hpp>
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (nano::node_observers & node_observers, std::string const & name)
|
||||
nano::container_info nano::node_observers::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<nano::container_info_composite> (name);
|
||||
composite->add_component (node_observers.blocks.collect_container_info ("blocks"));
|
||||
composite->add_component (node_observers.wallet.collect_container_info ("wallet"));
|
||||
composite->add_component (node_observers.vote.collect_container_info ("vote"));
|
||||
composite->add_component (node_observers.active_started.collect_container_info ("active_started"));
|
||||
composite->add_component (node_observers.active_stopped.collect_container_info ("active_stopped"));
|
||||
composite->add_component (node_observers.account_balance.collect_container_info ("account_balance"));
|
||||
composite->add_component (node_observers.endpoint.collect_container_info ("endpoint"));
|
||||
composite->add_component (node_observers.disconnect.collect_container_info ("disconnect"));
|
||||
composite->add_component (node_observers.work_cancel.collect_container_info ("work_cancel"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("blocks", blocks.size ());
|
||||
info.put ("wallet", wallet.size ());
|
||||
info.put ("vote", vote.size ());
|
||||
info.put ("active_started", active_started.size ());
|
||||
info.put ("active_stopped", active_stopped.size ());
|
||||
info.put ("account_balance", account_balance.size ());
|
||||
info.put ("endpoint", endpoint.size ());
|
||||
info.put ("disconnect", disconnect.size ());
|
||||
info.put ("work_cancel", work_cancel.size ());
|
||||
info.put ("telemetry", telemetry.size ());
|
||||
info.put ("socket_connected", socket_connected.size ());
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -34,7 +34,7 @@ public:
|
|||
nano::observer_set<nano::root const &> work_cancel;
|
||||
nano::observer_set<nano::telemetry_data const &, std::shared_ptr<nano::transport::channel> const &> telemetry;
|
||||
nano::observer_set<nano::transport::tcp_socket &> socket_connected;
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (node_observers & node_observers, std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -117,16 +117,11 @@ void nano::online_reps::clear ()
|
|||
online_m = 0;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (online_reps & online_reps, std::string const & name)
|
||||
nano::container_info nano::online_reps::container_info () const
|
||||
{
|
||||
std::size_t count;
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ online_reps.mutex };
|
||||
count = online_reps.reps.size ();
|
||||
}
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto sizeof_element = sizeof (decltype (online_reps.reps)::value_type);
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "reps", count, sizeof_element }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("reps", reps);
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -39,6 +39,9 @@ public:
|
|||
/** List of online representatives, both the currently sampling ones and the ones observed in the previous sampling period */
|
||||
std::vector<nano::account> list ();
|
||||
void clear ();
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public:
|
||||
static unsigned constexpr online_weight_quorum = 67;
|
||||
|
||||
private:
|
||||
|
@ -71,8 +74,5 @@ private:
|
|||
nano::uint128_t minimum;
|
||||
|
||||
friend class election_quorum_minimum_update_weight_before_quorum_checks_Test;
|
||||
friend std::unique_ptr<container_info_component> collect_container_info (online_reps & online_reps, std::string const & name);
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (online_reps & online_reps, std::string const & name);
|
||||
}
|
||||
|
|
|
@ -97,11 +97,11 @@ std::size_t nano::peer_exclusion::size () const
|
|||
return peers.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::peer_exclusion::collect_container_info (std::string const & name)
|
||||
nano::container_info nano::peer_exclusion::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "peers", peers.size (), sizeof (decltype (peers)::value_type) }));
|
||||
return composite;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.put ("peers", peers.size ());
|
||||
return info;
|
||||
}
|
|
@ -1,3 +1,5 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/node/common.hpp>
|
||||
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
|
@ -54,6 +56,6 @@ public:
|
|||
void remove (nano::tcp_endpoint const &);
|
||||
std::size_t size () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -32,11 +32,11 @@ std::size_t nano::recently_cemented_cache::size () const
|
|||
return cemented.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::recently_cemented_cache::collect_container_info (const std::string & name)
|
||||
nano::container_info nano::recently_cemented_cache::container_info () const
|
||||
{
|
||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "cemented", cemented.size (), sizeof (decltype (cemented)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("cemented", cemented);
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -26,13 +26,12 @@ public:
|
|||
queue_t list () const;
|
||||
std::size_t size () const;
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
queue_t cemented;
|
||||
std::size_t const max_size;
|
||||
|
||||
mutable nano::mutex mutex;
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const &);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -56,11 +56,11 @@ nano::recently_confirmed_cache::entry_t nano::recently_confirmed_cache::back ()
|
|||
return confirmed.back ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::recently_confirmed_cache::collect_container_info (const std::string & name)
|
||||
nano::container_info nano::recently_confirmed_cache::container_info () const
|
||||
{
|
||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "confirmed", confirmed.size (), sizeof (decltype (confirmed)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("confirmed", confirmed);
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -34,6 +34,8 @@ public:
|
|||
bool exists (nano::qualified_root const &) const;
|
||||
bool exists (nano::block_hash const &) const;
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public: // Tests
|
||||
entry_t back () const;
|
||||
|
||||
|
@ -56,8 +58,5 @@ private:
|
|||
std::size_t const max_size;
|
||||
|
||||
mutable nano::mutex mutex;
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const &);
|
||||
};
|
||||
}
|
||||
|
|
|
@ -118,6 +118,7 @@ void nano::rep_tiers::calculate_tiers ()
|
|||
|
||||
stats.add (nano::stat::type::rep_tiers, nano::stat::detail::processed, nano::stat::dir::in, rep_amounts.size ());
|
||||
stats.add (nano::stat::type::rep_tiers, nano::stat::detail::ignored, nano::stat::dir::in, ignored);
|
||||
|
||||
logger.debug (nano::log::type::rep_tiers, "Representative tiers updated, tier 1: {}, tier 2: {}, tier 3: {} ({} ignored)",
|
||||
representatives_1_l.size (),
|
||||
representatives_2_l.size (),
|
||||
|
@ -134,14 +135,15 @@ void nano::rep_tiers::calculate_tiers ()
|
|||
stats.inc (nano::stat::type::rep_tiers, nano::stat::detail::updated);
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::rep_tiers::collect_container_info (const std::string & name)
|
||||
nano::container_info nano::rep_tiers::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "representatives_1", representatives_1.size (), sizeof (decltype (representatives_1)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "representatives_2", representatives_2.size (), sizeof (decltype (representatives_2)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "representatives_3", representatives_3.size (), sizeof (decltype (representatives_3)::value_type) }));
|
||||
return composite;
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("tier_1", representatives_1);
|
||||
info.put ("tier_2", representatives_2);
|
||||
info.put ("tier_3", representatives_3);
|
||||
return info;
|
||||
}
|
||||
|
||||
nano::stat::detail nano::to_stat_detail (nano::rep_tier tier)
|
||||
|
|
|
@ -40,7 +40,7 @@ public:
|
|||
/** Returns the representative tier for the account */
|
||||
nano::rep_tier tier (nano::account const & representative) const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
nano::ledger & ledger;
|
||||
|
|
|
@ -435,7 +435,7 @@ nano::uint128_t nano::rep_crawler::total_weight () const
|
|||
return result;
|
||||
}
|
||||
|
||||
std::vector<nano::representative> nano::rep_crawler::representatives (std::size_t count, nano::uint128_t const minimum_weight, std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version)
|
||||
std::vector<nano::representative> nano::rep_crawler::representatives (std::size_t count, nano::uint128_t const minimum_weight, std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version) const
|
||||
{
|
||||
auto const version_min = minimum_protocol_version.value_or (node.network_params.network.protocol_version_min);
|
||||
|
||||
|
@ -460,28 +460,17 @@ std::vector<nano::representative> nano::rep_crawler::representatives (std::size_
|
|||
return result;
|
||||
}
|
||||
|
||||
std::vector<nano::representative> nano::rep_crawler::principal_representatives (std::size_t count, std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version)
|
||||
std::vector<nano::representative> nano::rep_crawler::principal_representatives (std::size_t count, std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version) const
|
||||
{
|
||||
return representatives (count, node.minimum_principal_weight (), minimum_protocol_version);
|
||||
}
|
||||
|
||||
std::size_t nano::rep_crawler::representative_count ()
|
||||
std::size_t nano::rep_crawler::representative_count () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
return reps.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::rep_crawler::collect_container_info (const std::string & name)
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "reps", reps.size (), sizeof (decltype (reps)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "queries", queries.size (), sizeof (decltype (queries)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "responses", responses.size (), sizeof (decltype (responses)::value_type) }));
|
||||
return composite;
|
||||
}
|
||||
|
||||
// Only for tests
|
||||
void nano::rep_crawler::force_add_rep (const nano::account & account, const std::shared_ptr<nano::transport::channel> & channel)
|
||||
{
|
||||
|
@ -506,6 +495,17 @@ void nano::rep_crawler::force_query (const nano::block_hash & hash, const std::s
|
|||
queries.emplace (query_entry{ hash, channel });
|
||||
}
|
||||
|
||||
nano::container_info nano::rep_crawler::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("reps", reps);
|
||||
info.put ("queries", queries);
|
||||
info.put ("responses", responses);
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
* rep_crawler_config
|
||||
*/
|
||||
|
|
|
@ -76,16 +76,16 @@ public:
|
|||
|
||||
/** Request a list of the top \p count known representatives in descending order of weight, with at least \p weight_a voting weight, and optionally with a minimum version \p minimum_protocol_version
|
||||
*/
|
||||
std::vector<representative> representatives (std::size_t count = std::numeric_limits<std::size_t>::max (), nano::uint128_t minimum_weight = 0, std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version = {});
|
||||
std::vector<representative> representatives (std::size_t count = std::numeric_limits<std::size_t>::max (), nano::uint128_t minimum_weight = 0, std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version = {}) const;
|
||||
|
||||
/** Request a list of the top \p count known principal representatives in descending order of weight, optionally with a minimum version \p minimum_protocol_version
|
||||
*/
|
||||
std::vector<representative> principal_representatives (std::size_t count = std::numeric_limits<std::size_t>::max (), std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version = {});
|
||||
std::vector<representative> principal_representatives (std::size_t count = std::numeric_limits<std::size_t>::max (), std::optional<decltype (nano::network_constants::protocol_version)> const & minimum_protocol_version = {}) const;
|
||||
|
||||
/** Total number of representatives */
|
||||
std::size_t representative_count ();
|
||||
std::size_t representative_count () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
rep_crawler_config const & config;
|
||||
|
|
|
@ -291,13 +291,13 @@ auto nano::request_aggregator::aggregate (nano::secure::transaction const & tran
|
|||
};
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::request_aggregator::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::request_aggregator::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (queue.collect_container_info ("queue"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.add ("queue", queue.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -51,7 +51,6 @@ public:
|
|||
void start ();
|
||||
void stop ();
|
||||
|
||||
public:
|
||||
using request_type = std::vector<std::pair<nano::block_hash, nano::root>>;
|
||||
|
||||
/** Add a new request by \p channel_a for hashes \p hashes_roots_a */
|
||||
|
@ -61,7 +60,7 @@ public:
|
|||
std::size_t size () const;
|
||||
bool empty () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
void run ();
|
||||
|
|
|
@ -37,12 +37,12 @@ void nano::scheduler::component::stop ()
|
|||
priority.stop ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::scheduler::component::collect_container_info (std::string const & name)
|
||||
nano::container_info nano::scheduler::component::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (hinted.collect_container_info ("hinted"));
|
||||
composite->add_component (manual.collect_container_info ("manual"));
|
||||
composite->add_component (optimistic.collect_container_info ("optimistic"));
|
||||
composite->add_component (priority.collect_container_info ("priority"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.add ("hinted", hinted.container_info ());
|
||||
info.add ("manual", manual.container_info ());
|
||||
info.add ("optimistic", optimistic.container_info ());
|
||||
info.add ("priority", priority.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -1,27 +1,14 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/node/fwd.hpp>
|
||||
|
||||
#include <memory>
|
||||
#include <string>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class container_info_component;
|
||||
class node;
|
||||
}
|
||||
namespace nano::scheduler
|
||||
{
|
||||
class hinted;
|
||||
class manual;
|
||||
class optimistic;
|
||||
class priority;
|
||||
|
||||
class component final
|
||||
{
|
||||
std::unique_ptr<nano::scheduler::hinted> hinted_impl;
|
||||
std::unique_ptr<nano::scheduler::manual> manual_impl;
|
||||
std::unique_ptr<nano::scheduler::optimistic> optimistic_impl;
|
||||
std::unique_ptr<nano::scheduler::priority> priority_impl;
|
||||
|
||||
public:
|
||||
explicit component (nano::node & node);
|
||||
~component ();
|
||||
|
@ -31,8 +18,15 @@ public:
|
|||
// Stops all schedulers
|
||||
void stop ();
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
std::unique_ptr<nano::scheduler::hinted> hinted_impl;
|
||||
std::unique_ptr<nano::scheduler::manual> manual_impl;
|
||||
std::unique_ptr<nano::scheduler::optimistic> optimistic_impl;
|
||||
std::unique_ptr<nano::scheduler::priority> priority_impl;
|
||||
|
||||
public: // Schedulers
|
||||
nano::scheduler::hinted & hinted;
|
||||
nano::scheduler::manual & manual;
|
||||
nano::scheduler::optimistic & optimistic;
|
||||
|
|
|
@ -236,13 +236,13 @@ bool nano::scheduler::hinted::cooldown (const nano::block_hash & hash)
|
|||
return false; // No need to cooldown
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::scheduler::hinted::collect_container_info (const std::string & name) const
|
||||
nano::container_info nano::scheduler::hinted::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "cooldowns", cooldowns_m.size (), sizeof (decltype (cooldowns_m)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("cooldowns", cooldowns_m);
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <nano/lib/locks.hpp>
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/secure/common.hpp>
|
||||
#include <nano/store/transaction.hpp>
|
||||
|
||||
|
@ -16,20 +17,6 @@
|
|||
|
||||
namespace mi = boost::multi_index;
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class node;
|
||||
class node_config;
|
||||
class active_elections;
|
||||
class vote_cache;
|
||||
class online_reps;
|
||||
}
|
||||
namespace nano::secure
|
||||
{
|
||||
class transaction;
|
||||
class read_transaction;
|
||||
}
|
||||
|
||||
namespace nano::scheduler
|
||||
{
|
||||
class hinted_config final
|
||||
|
@ -65,7 +52,7 @@ public:
|
|||
*/
|
||||
void notify ();
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
bool predicate () const;
|
||||
|
|
|
@ -86,11 +86,11 @@ void nano::scheduler::manual::run ()
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::scheduler::manual::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::scheduler::manual::container_info () const
|
||||
{
|
||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "queue", queue.size (), sizeof (decltype (queue)::value_type) }));
|
||||
return composite;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.put ("queue", queue);
|
||||
return info;
|
||||
}
|
|
@ -1,6 +1,8 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/locks.hpp>
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
|
||||
#include <boost/optional.hpp>
|
||||
|
||||
|
@ -8,16 +10,10 @@
|
|||
#include <memory>
|
||||
#include <mutex>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class block;
|
||||
enum class election_behavior;
|
||||
class node;
|
||||
}
|
||||
|
||||
namespace nano::scheduler
|
||||
{
|
||||
class buckets;
|
||||
|
||||
class manual final
|
||||
{
|
||||
std::deque<std::tuple<std::shared_ptr<nano::block>, boost::optional<nano::uint128_t>, nano::election_behavior>> queue;
|
||||
|
@ -31,7 +27,7 @@ class manual final
|
|||
void run ();
|
||||
|
||||
public:
|
||||
manual (nano::node & node);
|
||||
explicit manual (nano::node & node);
|
||||
~manual ();
|
||||
|
||||
void start ();
|
||||
|
@ -41,6 +37,6 @@ public:
|
|||
// Call action with confirmed block, may be different than what we started with
|
||||
void push (std::shared_ptr<nano::block> const &, boost::optional<nano::uint128_t> const & = boost::none);
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
}; // class manual
|
||||
} // nano::scheduler
|
||||
nano::container_info container_info () const;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -168,13 +168,13 @@ void nano::scheduler::optimistic::run_one (secure::transaction const & transacti
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::scheduler::optimistic::collect_container_info (const std::string & name) const
|
||||
nano::container_info nano::scheduler::optimistic::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "candidates", candidates.size (), sizeof (decltype (candidates)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("candidates", candidates);
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -4,6 +4,7 @@
|
|||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/lib/timer.hpp>
|
||||
#include <nano/lib/utility.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/secure/common.hpp>
|
||||
|
||||
#include <boost/multi_index/hashed_index.hpp>
|
||||
|
@ -20,14 +21,6 @@
|
|||
|
||||
namespace mi = boost::multi_index;
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class account_info;
|
||||
class active_elections;
|
||||
class ledger;
|
||||
class node;
|
||||
}
|
||||
|
||||
namespace nano::scheduler
|
||||
{
|
||||
class optimistic_config final
|
||||
|
@ -67,7 +60,7 @@ public:
|
|||
*/
|
||||
void notify ();
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
bool activate_predicate (nano::account_info const &, nano::confirmation_height_info const &) const;
|
||||
|
|
|
@ -229,30 +229,30 @@ auto nano::scheduler::priority::find_bucket (nano::uint128_t priority) -> bucket
|
|||
return **it;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::scheduler::priority::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::scheduler::priority::container_info () const
|
||||
{
|
||||
auto collect_blocks = [&] () {
|
||||
auto composite = std::make_unique<container_info_composite> ("blocks");
|
||||
nano::container_info info;
|
||||
for (auto i = 0; i < buckets.size (); ++i)
|
||||
{
|
||||
auto const & bucket = buckets[i];
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ std::to_string (i), bucket->size (), 0 }));
|
||||
info.put (std::to_string (i), bucket->size ());
|
||||
}
|
||||
return composite;
|
||||
return info;
|
||||
};
|
||||
|
||||
auto collect_elections = [&] () {
|
||||
auto composite = std::make_unique<container_info_composite> ("elections");
|
||||
nano::container_info info;
|
||||
for (auto i = 0; i < buckets.size (); ++i)
|
||||
{
|
||||
auto const & bucket = buckets[i];
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ std::to_string (i), bucket->election_count (), 0 }));
|
||||
info.put (std::to_string (i), bucket->election_count ());
|
||||
}
|
||||
return composite;
|
||||
return info;
|
||||
};
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (collect_blocks ());
|
||||
composite->add_component (collect_elections ());
|
||||
return composite;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.add ("blocks", collect_blocks ());
|
||||
info.add ("elections", collect_elections ());
|
||||
return info;
|
||||
}
|
|
@ -1,6 +1,7 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/node/scheduler/bucket.hpp>
|
||||
|
||||
#include <condition_variable>
|
||||
|
@ -9,22 +10,10 @@
|
|||
#include <string>
|
||||
#include <thread>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class account_info;
|
||||
class confirmation_height_info;
|
||||
class block;
|
||||
class container_info_component;
|
||||
class node;
|
||||
class stats;
|
||||
}
|
||||
namespace nano::secure
|
||||
{
|
||||
class transaction;
|
||||
}
|
||||
|
||||
namespace nano::scheduler
|
||||
{
|
||||
class buckets;
|
||||
|
||||
class priority_config
|
||||
{
|
||||
public:
|
||||
|
@ -34,7 +23,6 @@ public:
|
|||
bool enabled{ true };
|
||||
};
|
||||
|
||||
class buckets;
|
||||
class priority final
|
||||
{
|
||||
public:
|
||||
|
@ -55,7 +43,7 @@ public:
|
|||
std::size_t size () const;
|
||||
bool empty () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
priority_config const & config;
|
||||
|
|
|
@ -289,11 +289,11 @@ std::unordered_map<nano::endpoint, nano::telemetry_data> nano::telemetry::get_al
|
|||
return result;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::telemetry::collect_container_info (const std::string & name)
|
||||
nano::container_info nano::telemetry::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "telemetries", telemetries.size (), sizeof (decltype (telemetries)::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("telemetries", telemetries.size ());
|
||||
return info;
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
#include <nano/lib/utility.hpp>
|
||||
#include <nano/node/common.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/node/messages.hpp>
|
||||
#include <nano/node/nodeconfig.hpp>
|
||||
#include <nano/secure/common.hpp>
|
||||
|
@ -20,18 +21,6 @@ namespace mi = boost::multi_index;
|
|||
|
||||
namespace nano
|
||||
{
|
||||
class node;
|
||||
class network;
|
||||
class node_observers;
|
||||
class stats;
|
||||
class ledger;
|
||||
class thread_pool;
|
||||
class unchecked_map;
|
||||
namespace transport
|
||||
{
|
||||
class channel;
|
||||
}
|
||||
|
||||
class telemetry_config final
|
||||
{
|
||||
public:
|
||||
|
@ -84,8 +73,7 @@ public:
|
|||
*/
|
||||
std::unordered_map<nano::endpoint, nano::telemetry_data> get_all_telemetries () const;
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
telemetry_config const config;
|
||||
|
|
|
@ -5,5 +5,6 @@ namespace nano::transport
|
|||
class channel;
|
||||
class tcp_channel;
|
||||
class tcp_channels;
|
||||
class tcp_server;
|
||||
class tcp_socket;
|
||||
}
|
|
@ -312,23 +312,6 @@ bool nano::transport::tcp_channels::track_reachout (nano::endpoint const & endpo
|
|||
return inserted;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::transport::tcp_channels::collect_container_info (std::string const & name)
|
||||
{
|
||||
std::size_t channels_count;
|
||||
std::size_t attemps_count;
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
channels_count = channels.size ();
|
||||
attemps_count = attempts.size ();
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
void nano::transport::tcp_channels::purge (std::chrono::steady_clock::time_point cutoff_deadline)
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
|
@ -449,4 +432,14 @@ void nano::transport::tcp_channels::modify (std::shared_ptr<nano::transport::tcp
|
|||
void nano::transport::tcp_channels::start_tcp (nano::endpoint const & endpoint)
|
||||
{
|
||||
node.tcp_listener.connect (endpoint.address (), endpoint.port ());
|
||||
}
|
||||
|
||||
nano::container_info nano::transport::tcp_channels::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("channels", channels.size ());
|
||||
info.put ("attempts", attempts.size ());
|
||||
return info;
|
||||
}
|
|
@ -48,7 +48,6 @@ public:
|
|||
bool max_ip_or_subnetwork_connections (nano::tcp_endpoint const & endpoint_a);
|
||||
// Should we reach out to this endpoint with a keepalive message? If yes, register a new reachout attempt
|
||||
bool track_reachout (nano::endpoint const &);
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const &);
|
||||
void purge (std::chrono::steady_clock::time_point cutoff_deadline);
|
||||
void list (std::deque<std::shared_ptr<nano::transport::channel>> &, uint8_t = 0, bool = true);
|
||||
void modify (std::shared_ptr<nano::transport::tcp_channel> const &, std::function<void (std::shared_ptr<nano::transport::tcp_channel> const &)>);
|
||||
|
@ -58,6 +57,8 @@ public:
|
|||
// Connection start
|
||||
void start_tcp (nano::endpoint const &);
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
nano::node & node;
|
||||
|
||||
|
|
|
@ -601,12 +601,14 @@ auto nano::transport::tcp_listener::servers () const -> std::vector<std::shared_
|
|||
return { r.begin (), r.end () };
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::transport::tcp_listener::collect_container_info (std::string const & name)
|
||||
nano::container_info nano::transport::tcp_listener::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "connections", connection_count (), sizeof (decltype (connections)::value_type) }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "attempts", attempt_count (), sizeof (decltype (attempts)::value_type) }));
|
||||
return composite;
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("connections", connections.size ());
|
||||
info.put ("attempts", attempts.size ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -22,9 +22,6 @@ namespace asio = boost::asio;
|
|||
|
||||
namespace nano::transport
|
||||
{
|
||||
class socket;
|
||||
class tcp_server;
|
||||
|
||||
class tcp_config
|
||||
{
|
||||
public:
|
||||
|
@ -84,7 +81,7 @@ public:
|
|||
std::vector<std::shared_ptr<nano::transport::tcp_socket>> sockets () const;
|
||||
std::vector<std::shared_ptr<nano::transport::tcp_server>> servers () const;
|
||||
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name);
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public: // Events
|
||||
using connection_accepted_event_t = nano::observer_set<std::shared_ptr<nano::transport::tcp_socket> const &, std::shared_ptr<nano::transport::tcp_server>>;
|
||||
|
|
|
@ -102,12 +102,23 @@ void nano::unchecked_map::clear ()
|
|||
entries.clear ();
|
||||
}
|
||||
|
||||
std::size_t nano::unchecked_map::count () const
|
||||
size_t nano::unchecked_map::entries_size () const
|
||||
{
|
||||
nano::lock_guard<std::recursive_mutex> lock{ entries_mutex };
|
||||
return entries.size ();
|
||||
}
|
||||
|
||||
size_t nano::unchecked_map::queries_size () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
return buffer.size ();
|
||||
}
|
||||
|
||||
size_t nano::unchecked_map::count () const
|
||||
{
|
||||
return entries_size ();
|
||||
}
|
||||
|
||||
void nano::unchecked_map::trigger (nano::hash_or_account const & dependency)
|
||||
{
|
||||
nano::unique_lock<nano::mutex> lock{ mutex };
|
||||
|
@ -166,16 +177,10 @@ void nano::unchecked_map::query_impl (nano::block_hash const & hash)
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::unchecked_map::collect_container_info (const std::string & name)
|
||||
nano::container_info nano::unchecked_map::container_info () const
|
||||
{
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
{
|
||||
std::lock_guard guard{ entries_mutex };
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "entries", entries.size (), sizeof (decltype (entries)::value_type) }));
|
||||
}
|
||||
{
|
||||
nano::lock_guard<nano::mutex> lock{ mutex };
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "queries", buffer.size (), sizeof (decltype (buffer)::value_type) }));
|
||||
}
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("entries", entries_size ());
|
||||
info.put ("queries", queries_size ());
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -37,13 +37,18 @@ public:
|
|||
bool exists (nano::unchecked_key const & key) const;
|
||||
void del (nano::unchecked_key const & key);
|
||||
void clear ();
|
||||
std::size_t count () const;
|
||||
|
||||
/**
|
||||
* Trigger requested dependencies
|
||||
*/
|
||||
void trigger (nano::hash_or_account const & dependency);
|
||||
|
||||
size_t count () const; // Same as `entries_size ()`
|
||||
size_t entries_size () const;
|
||||
size_t queries_size () const;
|
||||
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public: // Events
|
||||
nano::observer_set<nano::unchecked_info const &> satisfied;
|
||||
|
||||
|
@ -62,7 +67,7 @@ private:
|
|||
|
||||
bool stopped{ false };
|
||||
nano::condition_variable condition;
|
||||
nano::mutex mutex;
|
||||
mutable nano::mutex mutex; // Protects queries
|
||||
std::thread thread;
|
||||
|
||||
unsigned const max_unchecked_blocks;
|
||||
|
@ -88,9 +93,6 @@ private:
|
|||
// clang-format on
|
||||
ordered_unchecked entries;
|
||||
|
||||
mutable std::recursive_mutex entries_mutex;
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name);
|
||||
mutable std::recursive_mutex entries_mutex; // Protects entries
|
||||
};
|
||||
}
|
||||
|
|
|
@ -272,13 +272,13 @@ void nano::vote_cache::cleanup ()
|
|||
});
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::vote_cache::collect_container_info (const std::string & name) const
|
||||
nano::container_info nano::vote_cache::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "cache", cache.size (), sizeof (ordered_cache::value_type) }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("cache", cache);
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -144,7 +144,6 @@ public:
|
|||
std::size_t size () const;
|
||||
bool empty () const;
|
||||
|
||||
public:
|
||||
struct top_entry
|
||||
{
|
||||
nano::block_hash hash;
|
||||
|
@ -159,8 +158,7 @@ public:
|
|||
*/
|
||||
std::deque<top_entry> top (nano::uint128_t const & min_tally);
|
||||
|
||||
public: // Container info
|
||||
std::unique_ptr<nano::container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public:
|
||||
/**
|
||||
|
|
|
@ -314,20 +314,13 @@ void nano::vote_generator::run ()
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::vote_generator::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::vote_generator::container_info () const
|
||||
{
|
||||
std::size_t candidates_count = 0;
|
||||
std::size_t requests_count = 0;
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
candidates_count = candidates.size ();
|
||||
requests_count = requests.size ();
|
||||
}
|
||||
auto sizeof_candidate_element = sizeof (decltype (candidates)::value_type);
|
||||
auto sizeof_request_element = sizeof (decltype (requests)::value_type);
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "candidates", candidates_count, sizeof_candidate_element }));
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "requests", requests_count, sizeof_request_element }));
|
||||
composite->add_component (vote_generation_queue.collect_container_info ("vote_generation_queue"));
|
||||
return composite;
|
||||
}
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("candidates", candidates.size ());
|
||||
info.put ("requests", requests.size ());
|
||||
info.add ("queue", vote_generation_queue.container_info ());
|
||||
return info;
|
||||
}
|
|
@ -5,6 +5,7 @@
|
|||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/lib/processing_queue.hpp>
|
||||
#include <nano/lib/utility.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
#include <nano/node/wallet.hpp>
|
||||
#include <nano/secure/common.hpp>
|
||||
|
||||
|
@ -21,29 +22,6 @@
|
|||
|
||||
namespace mi = boost::multi_index;
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class ledger;
|
||||
class local_vote_history;
|
||||
class network;
|
||||
class node;
|
||||
class node_config;
|
||||
class stats;
|
||||
class vote_processor;
|
||||
class vote_spacing;
|
||||
class wallets;
|
||||
}
|
||||
namespace nano::secure
|
||||
{
|
||||
class transaction;
|
||||
class write_transaction;
|
||||
class read_transaction;
|
||||
}
|
||||
namespace nano::transport
|
||||
{
|
||||
class channel;
|
||||
}
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class vote_generator final
|
||||
|
@ -66,7 +44,7 @@ public:
|
|||
void start ();
|
||||
void stop ();
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
using transaction_variant_t = std::variant<nano::secure::read_transaction, nano::secure::write_transaction>;
|
||||
|
@ -96,7 +74,7 @@ private: // Dependencies
|
|||
nano::logger & logger;
|
||||
|
||||
private:
|
||||
processing_queue<queue_entry_t> vote_generation_queue;
|
||||
nano::processing_queue<queue_entry_t> vote_generation_queue;
|
||||
|
||||
private:
|
||||
const bool is_final;
|
||||
|
|
|
@ -218,14 +218,14 @@ bool nano::vote_processor::empty () const
|
|||
return queue.empty ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::vote_processor::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::vote_processor::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "votes", queue.size (), sizeof (decltype (queue)::value_type) }));
|
||||
composite->add_component (queue.collect_container_info ("queue"));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("votes", queue.size ());
|
||||
info.add ("queue", queue.container_info ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -343,12 +343,13 @@ bool nano::vote_cache_processor::empty () const
|
|||
return size () == 0;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::vote_cache_processor::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::vote_cache_processor::container_info () const
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "triggered", triggered.size (), sizeof (decltype (triggered)::value_type) }));
|
||||
return composite;
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("triggered", triggered.size ());
|
||||
return info;
|
||||
}
|
||||
|
||||
/*
|
||||
|
|
|
@ -52,7 +52,7 @@ public:
|
|||
std::size_t size () const;
|
||||
bool empty () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
std::atomic<uint64_t> total_processed{ 0 };
|
||||
|
||||
|
@ -98,7 +98,7 @@ public:
|
|||
std::size_t size () const;
|
||||
bool empty () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
void run ();
|
||||
|
|
|
@ -175,15 +175,6 @@ void nano::vote_router::stop ()
|
|||
}
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::vote_router::collect_container_info (std::string const & name) const
|
||||
{
|
||||
std::shared_lock lock{ mutex };
|
||||
|
||||
auto composite = std::make_unique<container_info_composite> (name);
|
||||
composite->add_component (std::make_unique<container_info_leaf> (container_info{ "elections", elections.size (), sizeof (decltype (elections)::value_type) }));
|
||||
return composite;
|
||||
}
|
||||
|
||||
void nano::vote_router::run ()
|
||||
{
|
||||
std::unique_lock lock{ mutex };
|
||||
|
@ -193,3 +184,12 @@ void nano::vote_router::run ()
|
|||
condition.wait_for (lock, 15s, [&] () { return stopped; });
|
||||
}
|
||||
}
|
||||
|
||||
nano::container_info nano::vote_router::container_info () const
|
||||
{
|
||||
std::shared_lock lock{ mutex };
|
||||
|
||||
nano::container_info info;
|
||||
info.put ("elections", elections);
|
||||
return info;
|
||||
}
|
|
@ -1,21 +1,13 @@
|
|||
#pragma once
|
||||
|
||||
#include <nano/lib/numbers.hpp>
|
||||
#include <nano/node/fwd.hpp>
|
||||
|
||||
#include <memory>
|
||||
#include <shared_mutex>
|
||||
#include <thread>
|
||||
#include <unordered_map>
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class container_info_component;
|
||||
class election;
|
||||
class recently_confirmed_cache;
|
||||
class vote;
|
||||
class vote_cache;
|
||||
}
|
||||
|
||||
namespace nano
|
||||
{
|
||||
enum class vote_code
|
||||
|
@ -46,6 +38,7 @@ class vote_router final
|
|||
public:
|
||||
vote_router (nano::vote_cache & cache, nano::recently_confirmed_cache & recently_confirmed);
|
||||
~vote_router ();
|
||||
|
||||
// Add a route for 'hash' to 'election'
|
||||
// Existing routes will be replaced
|
||||
// Election must hold the block for the hash being passed in
|
||||
|
@ -68,7 +61,7 @@ public:
|
|||
using vote_processed_event_t = nano::observer_set<std::shared_ptr<nano::vote> const &, nano::vote_source, std::unordered_map<nano::block_hash, nano::vote_code> const &>;
|
||||
vote_processed_event_t vote_processed;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private: // Dependencies
|
||||
nano::vote_cache & vote_cache;
|
||||
|
|
|
@ -1801,20 +1801,12 @@ bool nano::mdb_wallets_store::init_error () const
|
|||
return error;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::collect_container_info (wallets & wallets, std::string const & name)
|
||||
nano::container_info nano::wallets::container_info () const
|
||||
{
|
||||
std::size_t items_count;
|
||||
std::size_t actions_count;
|
||||
{
|
||||
nano::lock_guard<nano::mutex> guard{ wallets.mutex };
|
||||
items_count = wallets.items.size ();
|
||||
actions_count = wallets.actions.size ();
|
||||
}
|
||||
nano::lock_guard<nano::mutex> guard{ mutex };
|
||||
|
||||
auto sizeof_item_element = sizeof (decltype (wallets.items)::value_type);
|
||||
auto sizeof_actions_element = sizeof (decltype (wallets.actions)::value_type);
|
||||
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 }));
|
||||
return composite;
|
||||
nano::container_info info;
|
||||
info.put ("items", items.size ());
|
||||
info.put ("actions", actions.size ());
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -222,13 +222,15 @@ public:
|
|||
void ongoing_compute_reps ();
|
||||
void receive_confirmed (nano::block_hash const & hash_a, nano::account const & destination_a);
|
||||
std::unordered_map<nano::wallet_id, std::shared_ptr<nano::wallet>> get_wallets ();
|
||||
nano::container_info container_info () const;
|
||||
|
||||
nano::network_params & network_params;
|
||||
std::function<void (bool)> observer;
|
||||
std::unordered_map<nano::wallet_id, std::shared_ptr<nano::wallet>> items;
|
||||
std::multimap<nano::uint128_t, std::pair<std::shared_ptr<nano::wallet>, std::function<void (nano::wallet &)>>, std::greater<nano::uint128_t>> actions;
|
||||
nano::locked<std::unordered_map<nano::account, nano::root>> delayed_work;
|
||||
nano::mutex mutex;
|
||||
nano::mutex action_mutex;
|
||||
mutable nano::mutex mutex;
|
||||
mutable nano::mutex action_mutex;
|
||||
nano::condition_variable condition;
|
||||
nano::kdf kdf;
|
||||
MDB_dbi handle;
|
||||
|
@ -250,8 +252,6 @@ private:
|
|||
nano::wallet_representatives representatives;
|
||||
};
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (wallets & wallets, std::string const & name);
|
||||
|
||||
class wallets_store
|
||||
{
|
||||
public:
|
||||
|
|
|
@ -1,6 +1,14 @@
|
|||
#pragma once
|
||||
|
||||
namespace nano::secure
|
||||
{
|
||||
class transaction;
|
||||
class write_transaction;
|
||||
class read_transaction;
|
||||
}
|
||||
|
||||
namespace nano
|
||||
{
|
||||
class account_info;
|
||||
class vote;
|
||||
}
|
|
@ -1514,12 +1514,10 @@ uint64_t nano::ledger::pruned_count () const
|
|||
return cache.pruned_count;
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::ledger::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::ledger::container_info () const
|
||||
{
|
||||
auto count = bootstrap_weights.size ();
|
||||
auto sizeof_element = sizeof (decltype (bootstrap_weights)::value_type);
|
||||
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 (cache.rep_weights.collect_container_info ("rep_weights"));
|
||||
return composite;
|
||||
}
|
||||
nano::container_info info;
|
||||
info.put ("bootstrap_weights", bootstrap_weights);
|
||||
info.add ("rep_weights", cache.rep_weights.container_info ());
|
||||
return info;
|
||||
}
|
|
@ -82,7 +82,7 @@ public:
|
|||
uint64_t account_count () const;
|
||||
uint64_t pruned_count () const;
|
||||
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const & name) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
public:
|
||||
static nano::uint128_t const unit;
|
||||
|
|
|
@ -126,16 +126,11 @@ std::size_t nano::rep_weights::size () const
|
|||
return rep_amounts.size ();
|
||||
}
|
||||
|
||||
std::unique_ptr<nano::container_info_component> nano::rep_weights::collect_container_info (std::string const & name) const
|
||||
nano::container_info nano::rep_weights::container_info () const
|
||||
{
|
||||
size_t rep_amounts_count;
|
||||
std::shared_lock guard{ mutex };
|
||||
|
||||
{
|
||||
std::shared_lock guard{ mutex };
|
||||
rep_amounts_count = rep_amounts.size ();
|
||||
}
|
||||
auto sizeof_element = sizeof (decltype (rep_amounts)::value_type);
|
||||
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;
|
||||
nano::container_info info;
|
||||
info.put ("rep_amounts", rep_amounts);
|
||||
return info;
|
||||
}
|
||||
|
|
|
@ -29,7 +29,7 @@ public:
|
|||
/* Only use this method when loading rep weights from the database table */
|
||||
void copy_from (rep_weights & other_a);
|
||||
size_t size () const;
|
||||
std::unique_ptr<container_info_component> collect_container_info (std::string const &) const;
|
||||
nano::container_info container_info () const;
|
||||
|
||||
private:
|
||||
mutable std::shared_mutex mutex;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue