Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Moving networking related parameters off of the node config #3394

Merged
merged 1 commit into from
Jul 26, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions nano/core_test/network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -904,7 +904,7 @@ TEST (network, peer_max_tcp_attempts)
node_flags.disable_connection_cleanup = true;
nano::system system;
auto node = system.add_node (node_flags);
for (auto i (0); i < node->network_params.node.max_peers_per_ip; ++i)
for (auto i (0); i < node->network_params.network.max_peers_per_ip; ++i)
{
auto node2 (std::make_shared<nano::node> (system.io_ctx, nano::get_available_port (), nano::unique_path (), system.logging, system.work, node_flags));
node2->start ();
Expand All @@ -925,7 +925,7 @@ namespace transport
{
nano::system system (1);
auto node (system.nodes[0]);
for (auto i (0); i < node->network_params.node.max_peers_per_subnetwork; ++i)
for (auto i (0); i < node->network_params.network.max_peers_per_subnetwork; ++i)
{
auto address (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0x7f000001 + i))); // 127.0.0.1 hex
nano::endpoint endpoint (address, nano::get_available_port ());
Expand Down
27 changes: 27 additions & 0 deletions nano/lib/config.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@

#include <algorithm>
#include <array>
#include <chrono>
#include <string>

namespace boost
Expand Down Expand Up @@ -120,6 +121,13 @@ class network_constants
default_ipc_port = is_live_network () ? 7077 : is_beta_network () ? 56000 : is_test_network () ? test_ipc_port () : 46000;
default_websocket_port = is_live_network () ? 7078 : is_beta_network () ? 57000 : is_test_network () ? test_websocket_port () : 47000;
request_interval_ms = is_dev_network () ? 20 : 500;
cleanup_period = is_dev_network () ? std::chrono::seconds (1) : std::chrono::seconds (60);
idle_timeout = is_dev_network () ? cleanup_period * 15 : cleanup_period * 2;
syn_cookie_cutoff = std::chrono::seconds (5);
bootstrap_interval = std::chrono::seconds (15 * 60);
max_peers_per_ip = is_dev_network () ? 10 : 5;
max_peers_per_subnetwork = max_peers_per_ip * 4;
peer_dump_interval = is_dev_network () ? std::chrono::seconds (1) : std::chrono::seconds (5 * 60);
}

/** Network work thresholds. Define these inline as constexpr when moving to cpp17. */
Expand All @@ -142,6 +150,25 @@ class network_constants
uint16_t default_websocket_port;
unsigned request_interval_ms;

std::chrono::seconds cleanup_period;
std::chrono::milliseconds cleanup_period_half () const
{
return std::chrono::duration_cast<std::chrono::milliseconds> (cleanup_period) / 2;
}
std::chrono::seconds cleanup_cutoff () const
{
return cleanup_period * 5;
}
/** Default maximum idle time for a socket before it's automatically closed */
std::chrono::seconds idle_timeout;
std::chrono::seconds syn_cookie_cutoff;
std::chrono::seconds bootstrap_interval;
/** Maximum number of peers per IP */
size_t max_peers_per_ip;
/** Maximum number of peers per subnetwork */
size_t max_peers_per_subnetwork;
std::chrono::seconds peer_dump_interval;

/** Returns the network this object contains values for */
nano::networks network () const
{
Expand Down
2 changes: 1 addition & 1 deletion nano/node/bootstrap/bootstrap_connections.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ void nano::bootstrap_connections::pool_connection (std::shared_ptr<nano::bootstr
auto const & socket_l = client_a->socket;
if (!stopped && !client_a->pending_stop && !node.network.excluded_peers.check (client_a->channel->get_tcp_endpoint ()))
{
socket_l->start_timer (node.network_params.node.idle_timeout);
socket_l->start_timer (node.network_params.network.idle_timeout);
// Push into idle deque
if (!push_front)
{
Expand Down
2 changes: 1 addition & 1 deletion nano/node/bootstrap/bootstrap_server.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -146,7 +146,7 @@ void nano::bootstrap_server::stop ()
void nano::bootstrap_server::receive ()
{
// Increase timeout to receive TCP header (idle server socket)
socket->set_timeout (node->network_params.node.idle_timeout);
socket->set_timeout (node->network_params.network.idle_timeout);
auto this_l (shared_from_this ());
socket->async_read (receive_buffer, 8, [this_l] (boost::system::error_code const & ec, size_t size_a) {
// Set remote_endpoint
Expand Down
8 changes: 4 additions & 4 deletions nano/node/network.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@

nano::network::network (nano::node & node_a, uint16_t port_a) :
id (nano::network_constants::active_network),
syn_cookies (node_a.network_params.node.max_peers_per_ip),
syn_cookies (node_a.network_params.network.max_peers_per_ip),
inbound{ [this] (nano::message const & message, std::shared_ptr<nano::transport::channel> const & channel) {
if (message.header.network == id)
{
Expand Down Expand Up @@ -745,9 +745,9 @@ void nano::network::cleanup (std::chrono::steady_clock::time_point const & cutof

void nano::network::ongoing_cleanup ()
{
cleanup (std::chrono::steady_clock::now () - node.network_params.node.cutoff);
cleanup (std::chrono::steady_clock::now () - node.network_params.network.cleanup_cutoff ());
std::weak_ptr<nano::node> node_w (node.shared ());
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.node.period, [node_w] () {
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.network.cleanup_period, [node_w] () {
if (auto node_l = node_w.lock ())
{
node_l->network.ongoing_cleanup ();
Expand All @@ -772,7 +772,7 @@ void nano::network::ongoing_keepalive ()
flood_keepalive (0.75f);
flood_keepalive_self (0.25f);
std::weak_ptr<nano::node> node_w (node.shared ());
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.node.half_period, [node_w] () {
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.network.cleanup_period_half (), [node_w] () {
if (auto node_l = node_w.lock ())
{
node_l->network.ongoing_keepalive ();
Expand Down
4 changes: 2 additions & 2 deletions nano/node/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -785,7 +785,7 @@ void nano::node::ongoing_rep_calculation ()

void nano::node::ongoing_bootstrap ()
{
auto next_wakeup (network_params.node.bootstrap_interval);
auto next_wakeup = network_params.network.bootstrap_interval;
if (warmed_up < 3)
{
// Re-attempt bootstrapping more aggressively on startup
Expand Down Expand Up @@ -848,7 +848,7 @@ void nano::node::ongoing_peer_store ()
bool stored (network.tcp_channels.store_all (true));
network.udp_channels.store_all (!stored);
std::weak_ptr<nano::node> node_w (shared_from_this ());
workers.add_timed_task (std::chrono::steady_clock::now () + network_params.node.peer_interval, [node_w] () {
workers.add_timed_task (std::chrono::steady_clock::now () + network_params.network.peer_dump_interval, [node_w] () {
if (auto node_l = node_w.lock ())
{
node_l->ongoing_peer_store ();
Expand Down
2 changes: 1 addition & 1 deletion nano/node/socket.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -269,7 +269,7 @@ void nano::server_socket::on_connection (std::function<bool (std::shared_ptr<nan
// Make sure the new connection doesn't idle. Note that in most cases, the callback is going to start
// an IO operation immediately, which will start a timer.
new_connection->checkup ();
new_connection->start_timer (this_l->node.network_params.network.is_dev_network () ? std::chrono::seconds (2) : this_l->node.network_params.node.idle_timeout);
new_connection->start_timer (this_l->node.network_params.network.is_dev_network () ? std::chrono::seconds (2) : this_l->node.network_params.network.idle_timeout);
this_l->node.stats.inc (nano::stat::type::tcp, nano::stat::detail::tcp_accept_success, nano::stat::dir::in);
this_l->connections.push_back (new_connection);
if (callback_a (new_connection, ec_a))
Expand Down
8 changes: 4 additions & 4 deletions nano/node/transport/tcp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -374,10 +374,10 @@ bool nano::transport::tcp_channels::max_ip_connections (nano::tcp_endpoint const
auto const address (nano::transport::ipv4_address_or_ipv6_subnet (endpoint_a.address ()));
auto const subnet (nano::transport::map_address_to_subnetwork (endpoint_a.address ()));
nano::unique_lock<nano::mutex> lock (mutex);
result = channels.get<ip_address_tag> ().count (address) >= node.network_params.node.max_peers_per_ip || channels.get<subnetwork_tag> ().count (subnet) >= node.network_params.node.max_peers_per_subnetwork;
result = channels.get<ip_address_tag> ().count (address) >= node.network_params.network.max_peers_per_ip || channels.get<subnetwork_tag> ().count (subnet) >= node.network_params.network.max_peers_per_subnetwork;
if (!result)
{
result = attempts.get<ip_address_tag> ().count (address) >= node.network_params.node.max_peers_per_ip || attempts.get<subnetwork_tag> ().count (subnet) >= node.network_params.node.max_peers_per_subnetwork;
result = attempts.get<ip_address_tag> ().count (address) >= node.network_params.network.max_peers_per_ip || attempts.get<subnetwork_tag> ().count (subnet) >= node.network_params.network.max_peers_per_subnetwork;
}
}
if (result)
Expand Down Expand Up @@ -450,7 +450,7 @@ void nano::transport::tcp_channels::ongoing_keepalive ()
nano::unique_lock<nano::mutex> lock (mutex);
// Wake up channels
std::vector<std::shared_ptr<nano::transport::channel_tcp>> send_list;
auto keepalive_sent_cutoff (channels.get<last_packet_sent_tag> ().lower_bound (std::chrono::steady_clock::now () - node.network_params.node.period));
auto keepalive_sent_cutoff (channels.get<last_packet_sent_tag> ().lower_bound (std::chrono::steady_clock::now () - node.network_params.network.cleanup_period));
for (auto i (channels.get<last_packet_sent_tag> ().begin ()); i != keepalive_sent_cutoff; ++i)
{
send_list.push_back (i->channel);
Expand All @@ -475,7 +475,7 @@ void nano::transport::tcp_channels::ongoing_keepalive ()
}
}
std::weak_ptr<nano::node> node_w (node.shared ());
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.node.half_period, [node_w] () {
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.network.cleanup_period_half (), [node_w] () {
if (auto node_l = node_w.lock ())
{
if (!node_l->network.tcp_channels.stopped)
Expand Down
6 changes: 3 additions & 3 deletions nano/node/transport/udp.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -636,7 +636,7 @@ bool nano::transport::udp_channels::max_ip_connections (nano::endpoint const & e
auto const address (nano::transport::ipv4_address_or_ipv6_subnet (endpoint_a.address ()));
auto const subnet (nano::transport::map_address_to_subnetwork (endpoint_a.address ()));
nano::unique_lock<nano::mutex> lock (mutex);
result = channels.get<ip_address_tag> ().count (address) >= node.network_params.node.max_peers_per_ip || channels.get<subnetwork_tag> ().count (subnet) >= node.network_params.node.max_peers_per_subnetwork;
result = channels.get<ip_address_tag> ().count (address) >= node.network_params.network.max_peers_per_ip || channels.get<subnetwork_tag> ().count (subnet) >= node.network_params.network.max_peers_per_subnetwork;
}
return result;
}
Expand Down Expand Up @@ -690,7 +690,7 @@ void nano::transport::udp_channels::ongoing_keepalive ()
node.network.random_fill (message.peers);
std::vector<std::shared_ptr<nano::transport::channel_udp>> send_list;
nano::unique_lock<nano::mutex> lock (mutex);
auto keepalive_cutoff (channels.get<last_packet_received_tag> ().lower_bound (std::chrono::steady_clock::now () - node.network_params.node.period));
auto keepalive_cutoff (channels.get<last_packet_received_tag> ().lower_bound (std::chrono::steady_clock::now () - node.network_params.network.cleanup_period));
for (auto i (channels.get<last_packet_received_tag> ().begin ()); i != keepalive_cutoff; ++i)
{
send_list.push_back (i->channel);
Expand All @@ -701,7 +701,7 @@ void nano::transport::udp_channels::ongoing_keepalive ()
channel->send (message);
}
std::weak_ptr<nano::node> node_w (node.shared ());
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.node.period, [node_w] () {
node.workers.add_timed_task (std::chrono::steady_clock::now () + node.network_params.network.cleanup_period, [node_w] () {
if (auto node_l = node_w.lock ())
{
node_l->network.udp_channels.ongoing_keepalive ();
Expand Down
9 changes: 0 additions & 9 deletions nano/secure/common.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -166,19 +166,10 @@ nano::random_constants::random_constants ()

nano::node_constants::node_constants (nano::network_constants & network_constants)
{
period = network_constants.is_dev_network () ? std::chrono::seconds (1) : std::chrono::seconds (60);
half_period = network_constants.is_dev_network () ? std::chrono::milliseconds (500) : std::chrono::milliseconds (30 * 1000);
idle_timeout = network_constants.is_dev_network () ? period * 15 : period * 2;
cutoff = period * 5;
syn_cookie_cutoff = std::chrono::seconds (5);
backup_interval = std::chrono::minutes (5);
bootstrap_interval = std::chrono::seconds (15 * 60);
search_pending_interval = network_constants.is_dev_network () ? std::chrono::seconds (1) : std::chrono::seconds (5 * 60);
peer_interval = search_pending_interval;
unchecked_cleaning_interval = std::chrono::minutes (30);
process_confirmed_interval = network_constants.is_dev_network () ? std::chrono::milliseconds (50) : std::chrono::milliseconds (500);
max_peers_per_ip = network_constants.is_dev_network () ? 10 : 5;
max_peers_per_subnetwork = max_peers_per_ip * 4;
max_weight_samples = (network_constants.is_live_network () || network_constants.is_test_network ()) ? 4032 : 288;
weight_period = 5 * 60; // 5 minutes
}
Expand Down
12 changes: 0 additions & 12 deletions nano/secure/common.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -415,22 +415,10 @@ class node_constants
{
public:
node_constants (nano::network_constants & network_constants);
std::chrono::seconds period;
std::chrono::milliseconds half_period;
/** Default maximum idle time for a socket before it's automatically closed */
std::chrono::seconds idle_timeout;
std::chrono::seconds cutoff;
std::chrono::seconds syn_cookie_cutoff;
std::chrono::minutes backup_interval;
std::chrono::seconds bootstrap_interval;
std::chrono::seconds search_pending_interval;
std::chrono::seconds peer_interval;
std::chrono::minutes unchecked_cleaning_interval;
std::chrono::milliseconds process_confirmed_interval;
/** Maximum number of peers per IP */
size_t max_peers_per_ip;
/** Maximum number of peers per subnetwork */
size_t max_peers_per_subnetwork;

/** The maximum amount of samples for a 2 week period on live or 1 day on beta */
uint64_t max_weight_samples;
Expand Down
2 changes: 1 addition & 1 deletion nano/test_common/system.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ std::shared_ptr<nano::node> nano::system::add_node (nano::node_config const & no
nodes.push_back (node);
if (nodes.size () > 1)
{
debug_assert (nodes.size () - 1 <= node->network_params.node.max_peers_per_ip || node->flags.disable_max_peers_per_ip); // Check that we don't start more nodes than limit for single IP address
debug_assert (nodes.size () - 1 <= node->network_params.network.max_peers_per_ip || node->flags.disable_max_peers_per_ip); // Check that we don't start more nodes than limit for single IP address
auto begin = nodes.end () - 2;
for (auto i (begin), j (begin + 1), n (nodes.end ()); j != n; ++i, ++j)
{
Expand Down