Merge pull request #4182 from thsfs/add_bootstrap_ascending_config
Add config classes for ascending bootstrap
This commit is contained in:
commit
168367ac78
7 changed files with 124 additions and 22 deletions
|
|
@ -42,6 +42,8 @@ add_library(
|
||||||
bootstrap/bootstrap_bulk_pull.cpp
|
bootstrap/bootstrap_bulk_pull.cpp
|
||||||
bootstrap/bootstrap_bulk_push.hpp
|
bootstrap/bootstrap_bulk_push.hpp
|
||||||
bootstrap/bootstrap_bulk_push.cpp
|
bootstrap/bootstrap_bulk_push.cpp
|
||||||
|
bootstrap/bootstrap_config.hpp
|
||||||
|
bootstrap/bootstrap_config.cpp
|
||||||
bootstrap/bootstrap_connections.hpp
|
bootstrap/bootstrap_connections.hpp
|
||||||
bootstrap/bootstrap_connections.cpp
|
bootstrap/bootstrap_connections.cpp
|
||||||
bootstrap/bootstrap_frontier.hpp
|
bootstrap/bootstrap_frontier.hpp
|
||||||
|
|
|
||||||
|
|
@ -119,8 +119,9 @@ void nano::bootstrap_ascending::buffered_iterator::fill ()
|
||||||
* account_sets
|
* account_sets
|
||||||
*/
|
*/
|
||||||
|
|
||||||
nano::bootstrap_ascending::account_sets::account_sets (nano::stats & stats_a) :
|
nano::bootstrap_ascending::account_sets::account_sets (nano::stats & stats_a, nano::account_sets_config config_a) :
|
||||||
stats{ stats_a }
|
stats{ stats_a },
|
||||||
|
config{ std::move (config_a) }
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -239,7 +240,7 @@ bool nano::bootstrap_ascending::account_sets::check_timestamp (const nano::accou
|
||||||
auto iter = priorities.get<tag_account> ().find (account);
|
auto iter = priorities.get<tag_account> ().find (account);
|
||||||
if (iter != priorities.get<tag_account> ().end ())
|
if (iter != priorities.get<tag_account> ().end ())
|
||||||
{
|
{
|
||||||
if (nano::milliseconds_since_epoch () - iter->timestamp < cooldown)
|
if (nano::milliseconds_since_epoch () - iter->timestamp < config.cooldown)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
@ -249,14 +250,14 @@ bool nano::bootstrap_ascending::account_sets::check_timestamp (const nano::accou
|
||||||
|
|
||||||
void nano::bootstrap_ascending::account_sets::trim_overflow ()
|
void nano::bootstrap_ascending::account_sets::trim_overflow ()
|
||||||
{
|
{
|
||||||
if (priorities.size () > priorities_max)
|
if (priorities.size () > config.priorities_max)
|
||||||
{
|
{
|
||||||
// Evict the lowest priority entry
|
// Evict the lowest priority entry
|
||||||
priorities.get<tag_priority> ().erase (priorities.get<tag_priority> ().begin ());
|
priorities.get<tag_priority> ().erase (priorities.get<tag_priority> ().begin ());
|
||||||
|
|
||||||
stats.inc (nano::stat::type::bootstrap_ascending_accounts, nano::stat::detail::priority_erase_overflow);
|
stats.inc (nano::stat::type::bootstrap_ascending_accounts, nano::stat::detail::priority_erase_overflow);
|
||||||
}
|
}
|
||||||
if (blocking.size () > blocking_max)
|
if (blocking.size () > config.blocking_max)
|
||||||
{
|
{
|
||||||
// Evict the lowest priority entry
|
// Evict the lowest priority entry
|
||||||
blocking.get<tag_priority> ().erase (blocking.get<tag_priority> ().begin ());
|
blocking.get<tag_priority> ().erase (blocking.get<tag_priority> ().begin ());
|
||||||
|
|
@ -276,7 +277,7 @@ nano::account nano::bootstrap_ascending::account_sets::next ()
|
||||||
std::vector<nano::account> candidates;
|
std::vector<nano::account> candidates;
|
||||||
|
|
||||||
int iterations = 0;
|
int iterations = 0;
|
||||||
while (candidates.size () < account_sets::consideration_count && iterations++ < account_sets::consideration_count * 10)
|
while (candidates.size () < config.consideration_count && iterations++ < config.consideration_count * 10)
|
||||||
{
|
{
|
||||||
debug_assert (candidates.size () == weights.size ());
|
debug_assert (candidates.size () == weights.size ());
|
||||||
|
|
||||||
|
|
@ -373,8 +374,8 @@ nano::bootstrap_ascending::bootstrap_ascending (nano::node & node_a, nano::store
|
||||||
stats{ stat_a },
|
stats{ stat_a },
|
||||||
accounts{ stats },
|
accounts{ stats },
|
||||||
iterator{ store },
|
iterator{ store },
|
||||||
limiter{ requests_limit, 1.0 },
|
limiter{ node.config.bootstrap_ascending.requests_limit, 1.0 },
|
||||||
database_limiter{ database_requests_limit, 1.0 }
|
database_limiter{ node.config.bootstrap_ascending.database_requests_limit, 1.0 }
|
||||||
{
|
{
|
||||||
// TODO: This is called from a very congested blockprocessor thread. Offload this work to a dedicated processing thread
|
// TODO: This is called from a very congested blockprocessor thread. Offload this work to a dedicated processing thread
|
||||||
block_processor.batch_processed.add ([this] (auto const & batch) {
|
block_processor.batch_processed.add ([this] (auto const & batch) {
|
||||||
|
|
@ -444,8 +445,9 @@ void nano::bootstrap_ascending::send (std::shared_ptr<nano::transport::channel>
|
||||||
|
|
||||||
nano::asc_pull_req::blocks_payload request_payload;
|
nano::asc_pull_req::blocks_payload request_payload;
|
||||||
request_payload.start = tag.start;
|
request_payload.start = tag.start;
|
||||||
request_payload.count = pull_count;
|
request_payload.count = node.config.bootstrap_ascending.pull_count;
|
||||||
request_payload.start_type = (tag.type == async_tag::query_type::blocks_by_hash) ? nano::asc_pull_req::hash_type::block : nano::asc_pull_req::hash_type::account;
|
request_payload.start_type = (tag.type == async_tag::query_type::blocks_by_hash) ? nano::asc_pull_req::hash_type::block : nano::asc_pull_req::hash_type::account;
|
||||||
|
|
||||||
request.payload = request_payload;
|
request.payload = request_payload;
|
||||||
request.update_header ();
|
request.update_header ();
|
||||||
|
|
||||||
|
|
@ -691,7 +693,7 @@ void nano::bootstrap_ascending::run_timeouts ()
|
||||||
while (!stopped)
|
while (!stopped)
|
||||||
{
|
{
|
||||||
auto & tags_by_order = tags.get<tag_sequenced> ();
|
auto & tags_by_order = tags.get<tag_sequenced> ();
|
||||||
while (!tags_by_order.empty () && nano::time_difference (tags_by_order.front ().time, nano::milliseconds_since_epoch ()) > timeout)
|
while (!tags_by_order.empty () && nano::time_difference (tags_by_order.front ().time, nano::milliseconds_since_epoch ()) > node.config.bootstrap_ascending.timeout)
|
||||||
{
|
{
|
||||||
auto tag = tags_by_order.front ();
|
auto tag = tags_by_order.front ();
|
||||||
tags_by_order.pop_front ();
|
tags_by_order.pop_front ();
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@
|
||||||
#include <nano/lib/timer.hpp>
|
#include <nano/lib/timer.hpp>
|
||||||
#include <nano/node/bandwidth_limiter.hpp>
|
#include <nano/node/bandwidth_limiter.hpp>
|
||||||
#include <nano/node/bootstrap/bootstrap_attempt.hpp>
|
#include <nano/node/bootstrap/bootstrap_attempt.hpp>
|
||||||
|
#include <nano/node/bootstrap/bootstrap_config.hpp>
|
||||||
#include <nano/node/bootstrap/bootstrap_server.hpp>
|
#include <nano/node/bootstrap/bootstrap_server.hpp>
|
||||||
|
|
||||||
#include <boost/multi_index/hashed_index.hpp>
|
#include <boost/multi_index/hashed_index.hpp>
|
||||||
|
|
@ -131,7 +132,7 @@ public: // account_sets
|
||||||
class account_sets
|
class account_sets
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit account_sets (nano::stats &);
|
explicit account_sets (nano::stats &, nano::account_sets_config config = {});
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If an account is not blocked, increase its priority.
|
* If an account is not blocked, increase its priority.
|
||||||
|
|
@ -229,11 +230,8 @@ public: // account_sets
|
||||||
|
|
||||||
std::default_random_engine rng;
|
std::default_random_engine rng;
|
||||||
|
|
||||||
private: // TODO: Move into config
|
private:
|
||||||
static std::size_t constexpr consideration_count = 4;
|
nano::account_sets_config config;
|
||||||
static std::size_t constexpr priorities_max = 256 * 1024;
|
|
||||||
static std::size_t constexpr blocking_max = 256 * 1024;
|
|
||||||
static nano::millis_t constexpr cooldown = 3 * 1000;
|
|
||||||
|
|
||||||
public: // Consts
|
public: // Consts
|
||||||
static float constexpr priority_initial = 8.0f;
|
static float constexpr priority_initial = 8.0f;
|
||||||
|
|
@ -319,11 +317,5 @@ private:
|
||||||
mutable nano::condition_variable condition;
|
mutable nano::condition_variable condition;
|
||||||
std::thread thread;
|
std::thread thread;
|
||||||
std::thread timeout_thread;
|
std::thread timeout_thread;
|
||||||
|
|
||||||
private: // TODO: Move into config
|
|
||||||
static std::size_t constexpr requests_limit{ 128 };
|
|
||||||
static std::size_t constexpr database_requests_limit{ 1024 };
|
|
||||||
static std::size_t constexpr pull_count{ nano::bootstrap_server::max_blocks };
|
|
||||||
static nano::millis_t constexpr timeout{ 1000 * 3 };
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
58
nano/node/bootstrap/bootstrap_config.cpp
Normal file
58
nano/node/bootstrap/bootstrap_config.cpp
Normal file
|
|
@ -0,0 +1,58 @@
|
||||||
|
#include <nano/lib/tomlconfig.hpp>
|
||||||
|
#include <nano/node/bootstrap/bootstrap_config.hpp>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* account_sets_config
|
||||||
|
*/
|
||||||
|
nano::error nano::account_sets_config::deserialize (nano::tomlconfig & toml)
|
||||||
|
{
|
||||||
|
toml.get ("consideration_count", consideration_count);
|
||||||
|
toml.get ("priorities_max", priorities_max);
|
||||||
|
toml.get ("blocking_max", blocking_max);
|
||||||
|
toml.get ("cooldown", cooldown);
|
||||||
|
|
||||||
|
return toml.get_error ();
|
||||||
|
}
|
||||||
|
|
||||||
|
nano::error nano::account_sets_config::serialize (nano::tomlconfig & toml) const
|
||||||
|
{
|
||||||
|
toml.put ("consideration_count", consideration_count, "Limit the number of account candidates to consider and also the number of iterations.\ntype:uint64");
|
||||||
|
toml.put ("priorities_max", priorities_max, "Cutoff size limit for the priority list.\ntype:uint64");
|
||||||
|
toml.put ("blocking_max", blocking_max, "Cutoff size limit for the blocked accounts from the priority list.\ntype:uint64");
|
||||||
|
toml.put ("cooldown", cooldown, "Waiting time for an account to become available.\ntype:milliseconds");
|
||||||
|
|
||||||
|
return toml.get_error ();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* bootstrap_ascending_config
|
||||||
|
*/
|
||||||
|
nano::error nano::bootstrap_ascending_config::deserialize (nano::tomlconfig & toml)
|
||||||
|
{
|
||||||
|
toml.get ("requests_limit", requests_limit);
|
||||||
|
toml.get ("database_requests_limit", database_requests_limit);
|
||||||
|
toml.get ("pull_count", pull_count);
|
||||||
|
toml.get ("timeout", timeout);
|
||||||
|
|
||||||
|
if (toml.has_key ("account_sets"))
|
||||||
|
{
|
||||||
|
auto config_l = toml.get_required_child ("account_sets");
|
||||||
|
account_sets.deserialize (config_l);
|
||||||
|
}
|
||||||
|
|
||||||
|
return toml.get_error ();
|
||||||
|
}
|
||||||
|
|
||||||
|
nano::error nano::bootstrap_ascending_config::serialize (nano::tomlconfig & toml) const
|
||||||
|
{
|
||||||
|
toml.put ("requests_limit", requests_limit, "Request limit to ascending bootstrap after which requests will be dropped.\nNote: changing to unlimited (0) is not recommended.\ntype:uint64");
|
||||||
|
toml.put ("database_requests_limit", database_requests_limit, "Request limit for accounts from database after which requests will be dropped.\nNote: changing to unlimited (0) is not recommended as this operation competes for resources on querying the database.\ntype:uint64");
|
||||||
|
toml.put ("pull_count", pull_count, "Number of requested blocks for ascending bootstrap request.\ntype:uint64");
|
||||||
|
toml.put ("timeout", timeout, "Timeout in milliseconds for incoming ascending bootstrap messages to be processed.\ntype:milliseconds");
|
||||||
|
|
||||||
|
nano::tomlconfig account_sets_l;
|
||||||
|
account_sets.serialize (account_sets_l);
|
||||||
|
toml.put_child ("account_sets", account_sets_l);
|
||||||
|
|
||||||
|
return toml.get_error ();
|
||||||
|
}
|
||||||
36
nano/node/bootstrap/bootstrap_config.hpp
Normal file
36
nano/node/bootstrap/bootstrap_config.hpp
Normal file
|
|
@ -0,0 +1,36 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <nano/lib/errors.hpp>
|
||||||
|
#include <nano/lib/timer.hpp>
|
||||||
|
#include <nano/node/bootstrap/bootstrap_server.hpp>
|
||||||
|
|
||||||
|
namespace nano
|
||||||
|
{
|
||||||
|
class tomlconfig;
|
||||||
|
|
||||||
|
class account_sets_config final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nano::error deserialize (nano::tomlconfig & toml);
|
||||||
|
nano::error serialize (nano::tomlconfig & toml) const;
|
||||||
|
|
||||||
|
std::size_t consideration_count{ 4 };
|
||||||
|
std::size_t priorities_max{ 256 * 1024 };
|
||||||
|
std::size_t blocking_max{ 256 * 1024 };
|
||||||
|
nano::millis_t cooldown{ 1000 * 3 };
|
||||||
|
};
|
||||||
|
|
||||||
|
class bootstrap_ascending_config final
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
nano::error deserialize (nano::tomlconfig & toml);
|
||||||
|
nano::error serialize (nano::tomlconfig & toml) const;
|
||||||
|
|
||||||
|
std::size_t requests_limit{ 128 };
|
||||||
|
std::size_t database_requests_limit{ 1024 };
|
||||||
|
std::size_t pull_count{ nano::bootstrap_server::max_blocks };
|
||||||
|
nano::millis_t timeout{ 1000 * 3 };
|
||||||
|
|
||||||
|
nano::account_sets_config account_sets;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -198,6 +198,10 @@ nano::error nano::node_config::serialize_toml (nano::tomlconfig & toml) const
|
||||||
optimistic_scheduler.serialize (optimistic_l);
|
optimistic_scheduler.serialize (optimistic_l);
|
||||||
toml.put_child ("optimistic_scheduler", optimistic_l);
|
toml.put_child ("optimistic_scheduler", optimistic_l);
|
||||||
|
|
||||||
|
nano::tomlconfig bootstrap_ascending_l;
|
||||||
|
bootstrap_ascending.serialize (bootstrap_ascending_l);
|
||||||
|
toml.put_child ("bootstrap_ascending", bootstrap_ascending_l);
|
||||||
|
|
||||||
return toml.get_error ();
|
return toml.get_error ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -255,6 +259,12 @@ nano::error nano::node_config::deserialize_toml (nano::tomlconfig & toml)
|
||||||
optimistic_scheduler.deserialize (config_l);
|
optimistic_scheduler.deserialize (config_l);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (toml.has_key ("bootstrap_ascending"))
|
||||||
|
{
|
||||||
|
auto config_l = toml.get_required_child ("bootstrap_ascending");
|
||||||
|
bootstrap_ascending.deserialize (config_l);
|
||||||
|
}
|
||||||
|
|
||||||
if (toml.has_key ("work_peers"))
|
if (toml.has_key ("work_peers"))
|
||||||
{
|
{
|
||||||
work_peers.clear ();
|
work_peers.clear ();
|
||||||
|
|
|
||||||
|
|
@ -7,6 +7,7 @@
|
||||||
#include <nano/lib/numbers.hpp>
|
#include <nano/lib/numbers.hpp>
|
||||||
#include <nano/lib/rocksdbconfig.hpp>
|
#include <nano/lib/rocksdbconfig.hpp>
|
||||||
#include <nano/lib/stats.hpp>
|
#include <nano/lib/stats.hpp>
|
||||||
|
#include <nano/node/bootstrap/bootstrap_config.hpp>
|
||||||
#include <nano/node/ipc/ipc_config.hpp>
|
#include <nano/node/ipc/ipc_config.hpp>
|
||||||
#include <nano/node/logging.hpp>
|
#include <nano/node/logging.hpp>
|
||||||
#include <nano/node/optimistic_scheduler.hpp>
|
#include <nano/node/optimistic_scheduler.hpp>
|
||||||
|
|
@ -105,6 +106,7 @@ public:
|
||||||
std::size_t bootstrap_bandwidth_limit{ 5 * 1024 * 1024 };
|
std::size_t bootstrap_bandwidth_limit{ 5 * 1024 * 1024 };
|
||||||
/** Bootstrap traffic does not need bursts */
|
/** Bootstrap traffic does not need bursts */
|
||||||
double bootstrap_bandwidth_burst_ratio{ 1. };
|
double bootstrap_bandwidth_burst_ratio{ 1. };
|
||||||
|
nano::bootstrap_ascending_config bootstrap_ascending;
|
||||||
std::chrono::milliseconds conf_height_processor_batch_min_time{ 50 };
|
std::chrono::milliseconds conf_height_processor_batch_min_time{ 50 };
|
||||||
bool backup_before_upgrade{ false };
|
bool backup_before_upgrade{ false };
|
||||||
double max_work_generate_multiplier{ 64. };
|
double max_work_generate_multiplier{ 64. };
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue