diff --git a/nano/core_test/active_elections.cpp b/nano/core_test/active_elections.cpp index 57bdc2c05..ab0bb87f5 100644 --- a/nano/core_test/active_elections.cpp +++ b/nano/core_test/active_elections.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/core_test/election.cpp b/nano/core_test/election.cpp index 6c386ce08..365746eae 100644 --- a/nano/core_test/election.cpp +++ b/nano/core_test/election.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/core_test/ledger_confirm.cpp b/nano/core_test/ledger_confirm.cpp index a4789f296..5663154cc 100644 --- a/nano/core_test/ledger_confirm.cpp +++ b/nano/core_test/ledger_confirm.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/core_test/node.cpp b/nano/core_test/node.cpp index 21801313c..edeaac94e 100644 --- a/nano/core_test/node.cpp +++ b/nano/core_test/node.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/core_test/websocket.cpp b/nano/core_test/websocket.cpp index b090358e7..de52c6ab1 100644 --- a/nano/core_test/websocket.cpp +++ b/nano/core_test/websocket.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/nano_node/entry.cpp b/nano/nano_node/entry.cpp index ec8add38d..b096cc7ea 100644 --- a/nano/nano_node/entry.cpp +++ b/nano/nano_node/entry.cpp @@ -15,6 +15,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/node/active_elections.cpp b/nano/node/active_elections.cpp index b532c1033..b6dc0bd64 100644 --- a/nano/node/active_elections.cpp +++ b/nano/node/active_elections.cpp @@ -8,6 +8,7 @@ #include #include #include +#include #include #include #include @@ -405,6 +406,7 @@ nano::election_insertion_result nano::active_elections::insert (std::shared_ptr< { result.inserted = true; auto observe_rep_cb = [&node = node] (auto const & rep_a) { + // TODO: Is this neccessary? Move this outside of the election class // Representative is defined as online if replying to live votes or rep_crawler queries node.online_reps.observe (rep_a); }; diff --git a/nano/node/election.cpp b/nano/node/election.cpp index d9b329f39..6780acfb1 100644 --- a/nano/node/election.cpp +++ b/nano/node/election.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/node/json_handler.cpp b/nano/node/json_handler.cpp index 6cff65f72..fcdca6a24 100644 --- a/nano/node/json_handler.cpp +++ b/nano/node/json_handler.cpp @@ -14,6 +14,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/node/node.cpp b/nano/node/node.cpp index a540fd547..14e6d0ba0 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -26,6 +26,7 @@ #include #include #include +#include #include #include #include @@ -138,7 +139,8 @@ nano::node::node (std::shared_ptr io_ctx_a, std::filesy rep_crawler (config.rep_crawler, *this), rep_tiers{ ledger, network_params, online_reps, stats, logger }, warmed_up (0), - online_reps (ledger, config), + online_reps_impl{ std::make_unique (config, ledger) }, + online_reps{ *online_reps_impl }, history_impl{ std::make_unique (config.network_params.voting) }, history{ *history_impl }, vote_uniquer{}, diff --git a/nano/node/node.hpp b/nano/node/node.hpp index 2225728a4..c9b10fbbf 100644 --- a/nano/node/node.hpp +++ b/nano/node/node.hpp @@ -12,6 +12,7 @@ #include #include #include +#include #include #include #include @@ -39,6 +40,7 @@ class message_processor; class monitor; class node; class telemetry; +class online_reps; class vote_processor; class vote_cache_processor; class vote_router; @@ -176,7 +178,8 @@ public: nano::bucketing & bucketing; std::unique_ptr active_impl; nano::active_elections & active; - nano::online_reps online_reps; + std::unique_ptr online_reps_impl; + nano::online_reps & online_reps; nano::rep_crawler rep_crawler; nano::rep_tiers rep_tiers; unsigned warmed_up; diff --git a/nano/node/online_reps.cpp b/nano/node/online_reps.cpp index b04912820..621bbe342 100644 --- a/nano/node/online_reps.cpp +++ b/nano/node/online_reps.cpp @@ -4,9 +4,9 @@ #include #include -nano::online_reps::online_reps (nano::ledger & ledger_a, nano::node_config const & config_a) : - ledger{ ledger_a }, - config{ config_a } +nano::online_reps::online_reps (nano::node_config const & config_a, nano::ledger & ledger_a) : + config{ config_a }, + ledger{ ledger_a } { if (!ledger.store.init_error ()) { diff --git a/nano/node/online_reps.hpp b/nano/node/online_reps.hpp index d8e60665d..e1f66c8e5 100644 --- a/nano/node/online_reps.hpp +++ b/nano/node/online_reps.hpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include @@ -13,24 +14,21 @@ #include #include +namespace mi = boost::multi_index; + namespace nano { -class ledger; -class node_config; -namespace store -{ - class transaction; -} - /** Track online representatives and trend online weight */ class online_reps final { public: - online_reps (nano::ledger & ledger_a, nano::node_config const & config_a); + online_reps (nano::node_config const &, nano::ledger &); + /** Add voting account \p rep_account to the set of online representatives */ void observe (nano::account const & rep_account); /** Called periodically to sample online weight */ void sample (); + /** Returns the trended online stake */ nano::uint128_t trended () const; /** Returns the current online stake */ @@ -45,34 +43,39 @@ public: public: static unsigned constexpr online_weight_quorum = 67; +private: // Dependencies + nano::node_config const & config; + nano::ledger & ledger; + private: - class rep_info + nano::uint128_t calculate_trend (nano::store::transaction &) const; + nano::uint128_t calculate_online () const; + +private: + struct rep_info { - public: std::chrono::steady_clock::time_point time; nano::account account; }; - class tag_time - { - }; - class tag_account - { - }; - nano::uint128_t calculate_trend (store::transaction &) const; - nano::uint128_t calculate_online () const; - mutable nano::mutex mutex; - nano::ledger & ledger; - nano::node_config const & config; - boost::multi_index_container, - boost::multi_index::member>, - boost::multi_index::hashed_unique, - boost::multi_index::member>>> - reps; + + // clang-format off + class tag_time {}; + class tag_account {}; + + using ordered_reps = boost::multi_index_container, + mi::member>, + mi::hashed_unique, + mi::member> + >>; + // clang-format off + ordered_reps reps; + nano::uint128_t trended_m; nano::uint128_t online_m; - nano::uint128_t minimum; + + mutable nano::mutex mutex; friend class election_quorum_minimum_update_weight_before_quorum_checks_Test; }; diff --git a/nano/node/repcrawler.cpp b/nano/node/repcrawler.cpp index ad4ad2d20..a24d6fbef 100644 --- a/nano/node/repcrawler.cpp +++ b/nano/node/repcrawler.cpp @@ -1,5 +1,6 @@ #include #include +#include #include #include #include diff --git a/nano/node/scheduler/hinted.cpp b/nano/node/scheduler/hinted.cpp index d6ab3465d..15b8fa530 100644 --- a/nano/node/scheduler/hinted.cpp +++ b/nano/node/scheduler/hinted.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/rpc_test/rpc.cpp b/nano/rpc_test/rpc.cpp index 4969605f7..82c9837d5 100644 --- a/nano/rpc_test/rpc.cpp +++ b/nano/rpc_test/rpc.cpp @@ -13,6 +13,7 @@ #include #include #include +#include #include #include #include diff --git a/nano/slow_test/node.cpp b/nano/slow_test/node.cpp index a96e12b47..f25ecff97 100644 --- a/nano/slow_test/node.cpp +++ b/nano/slow_test/node.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include #include #include