Skip to content

Commit

Permalink
Moving network sizing functions on to nano::network instead of the pe…
Browse files Browse the repository at this point in the history
…er_container. (nanocurrency#1836)
  • Loading branch information
clemahieu authored and Guilherme Lawless committed Apr 15, 2019
1 parent 45a6800 commit ef9426c
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 38 deletions.
18 changes: 9 additions & 9 deletions nano/core_test/network.cpp
Expand Up @@ -129,11 +129,11 @@ TEST (network, last_contacted)
system.deadline_set (10s);

// Wait until the handshake is complete
while (system.nodes[0]->peers.size () < 1)
while (system.nodes[0]->network.size () < 1)
{
ASSERT_NO_ERROR (system.poll ());
}
ASSERT_EQ (system.nodes[0]->peers.size (), 1);
ASSERT_EQ (system.nodes[0]->network.size (), 1);

// Make sure last_contact gets updated on receiving a non-handshake message
auto timestamp_before_keepalive = system.nodes[0]->peers.list_vector (1).front ().last_contact;
Expand All @@ -142,7 +142,7 @@ TEST (network, last_contacted)
{
ASSERT_NO_ERROR (system.poll ());
}
ASSERT_EQ (system.nodes[0]->peers.size (), 1);
ASSERT_EQ (system.nodes[0]->network.size (), 1);
auto timestamp_after_keepalive = system.nodes[0]->peers.list_vector (1).front ().last_contact;
ASSERT_GT (timestamp_after_keepalive, timestamp_before_keepalive);

Expand All @@ -159,12 +159,12 @@ TEST (network, multi_keepalive)
ASSERT_FALSE (init1.error ());
node1->start ();
system.nodes.push_back (node1);
ASSERT_EQ (0, node1->peers.size ());
ASSERT_EQ (0, node1->network.size ());
node1->network.send_keepalive (system.nodes[0]->network.endpoint ());
ASSERT_EQ (0, node1->peers.size ());
ASSERT_EQ (0, system.nodes[0]->peers.size ());
ASSERT_EQ (0, node1->network.size ());
ASSERT_EQ (0, system.nodes[0]->network.size ());
system.deadline_set (10s);
while (system.nodes[0]->peers.size () != 1)
while (system.nodes[0]->network.size () != 1)
{
ASSERT_NO_ERROR (system.poll ());
}
Expand All @@ -175,7 +175,7 @@ TEST (network, multi_keepalive)
system.nodes.push_back (node2);
node2->network.send_keepalive (system.nodes[0]->network.endpoint ());
system.deadline_set (10s);
while (node1->peers.size () != 2 || system.nodes[0]->peers.size () != 2 || node2->peers.size () != 2)
while (node1->network.size () != 2 || system.nodes[0]->network.size () != 2 || node2->network.size () != 2)
{
ASSERT_NO_ERROR (system.poll ());
}
Expand Down Expand Up @@ -1067,7 +1067,7 @@ TEST (bulk, offline_send)
do
{
ASSERT_NO_ERROR (system.poll ());
} while (system.nodes[0]->peers.empty () || node1->peers.empty ());
} while (system.nodes[0]->network.empty () || node1->network.empty ());
// Send block arrival via bootstrap
while (node1->balance (nano::test_genesis_key.pub) == std::numeric_limits<nano::uint256_t>::max ())
{
Expand Down
18 changes: 9 additions & 9 deletions nano/core_test/node.cpp
Expand Up @@ -447,7 +447,7 @@ TEST (node, connect_after_junk)
system.nodes.push_back (node1);
node1->network.send_keepalive (system.nodes[0]->network.endpoint ());
system.deadline_set (10s);
while (node1->peers.empty ())
while (node1->network.empty ())
{
ASSERT_NO_ERROR (system.poll ());
}
Expand Down Expand Up @@ -888,7 +888,7 @@ TEST (node, fork_keep)
nano::system system (24000, 2);
auto & node1 (*system.nodes[0]);
auto & node2 (*system.nodes[1]);
ASSERT_EQ (1, node1.peers.size ());
ASSERT_EQ (1, node1.network.size ());
nano::keypair key1;
nano::keypair key2;
nano::genesis genesis;
Expand Down Expand Up @@ -941,7 +941,7 @@ TEST (node, fork_flip)
nano::system system (24000, 2);
auto & node1 (*system.nodes[0]);
auto & node2 (*system.nodes[1]);
ASSERT_EQ (1, node1.peers.size ());
ASSERT_EQ (1, node1.network.size ());
nano::keypair key1;
nano::genesis genesis;
auto send1 (std::make_shared<nano::send_block> (genesis.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (genesis.hash ())));
Expand Down Expand Up @@ -998,7 +998,7 @@ TEST (node, fork_multi_flip)
nano::system system (24000, 2);
auto & node1 (*system.nodes[0]);
auto & node2 (*system.nodes[1]);
ASSERT_EQ (1, node1.peers.size ());
ASSERT_EQ (1, node1.network.size ());
nano::keypair key1;
nano::genesis genesis;
auto send1 (std::make_shared<nano::send_block> (genesis.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, system.work.generate (genesis.hash ())));
Expand Down Expand Up @@ -1081,7 +1081,7 @@ TEST (node, fork_bootstrap_flip)
}
node1.network.send_keepalive (node2.network.endpoint ());
system1.deadline_set (50s);
while (node2.peers.empty ())
while (node2.network.empty ())
{
ASSERT_NO_ERROR (system0.poll ());
ASSERT_NO_ERROR (system1.poll ());
Expand Down Expand Up @@ -1125,7 +1125,7 @@ TEST (node, fork_open_flip)
nano::system system (24000, 2);
auto & node1 (*system.nodes[0]);
auto & node2 (*system.nodes[1]);
ASSERT_EQ (1, node1.peers.size ());
ASSERT_EQ (1, node1.network.size ());
nano::keypair key1;
nano::genesis genesis;
nano::keypair rep1;
Expand Down Expand Up @@ -2304,7 +2304,7 @@ TEST (node, peers)

node->start ();
system.deadline_set (10s);
while (system.nodes.back ()->peers.empty ())
while (system.nodes.back ()->network.empty ())
{
ASSERT_NO_ERROR (system.poll ());
}
Expand All @@ -2319,12 +2319,12 @@ TEST (node, peers)
system.nodes.front ()->stop ();

system.deadline_set (10s);
while (system.nodes.back ()->peers.size () == 1)
while (system.nodes.back ()->network.size () == 1)
{
ASSERT_NO_ERROR (system.poll ());
}

ASSERT_TRUE (system.nodes.back ()->peers.empty ());
ASSERT_TRUE (system.nodes.back ()->network.empty ());

// Uncontactable peer should not be stored
auto transaction (store.tx_begin_read ());
Expand Down
24 changes: 15 additions & 9 deletions nano/core_test/peer_container.cpp
Expand Up @@ -4,9 +4,11 @@

TEST (peer_container, empty_peers)
{
nano::peer_container peers (nano::endpoint{});
nano::system system (24000, 1);
nano::peer_container & peers (system.nodes[0]->peers);
nano::network & network (system.nodes[0]->network);
peers.purge (std::chrono::steady_clock::now ());
ASSERT_EQ (0, peers.size ());
ASSERT_EQ (0, network.size ());
}

TEST (peer_container, no_recontact)
Expand All @@ -17,14 +19,14 @@ TEST (peer_container, no_recontact)
auto observed_peer (0);
auto observed_disconnect (false);
nano::endpoint endpoint1 (boost::asio::ip::address_v6::loopback (), 10000);
ASSERT_EQ (0, peers.size ());
ASSERT_EQ (0, network.size ());
peers.peer_observer = [&observed_peer](nano::endpoint const &) { ++observed_peer; };
network.disconnect_observer = [&observed_disconnect]() { observed_disconnect = true; };
ASSERT_FALSE (peers.insert (endpoint1, nano::protocol_version));
ASSERT_EQ (1, peers.size ());
ASSERT_EQ (1, network.size ());
ASSERT_TRUE (peers.insert (endpoint1, nano::protocol_version));
network.cleanup (std::chrono::steady_clock::now () + std::chrono::seconds (5));
ASSERT_TRUE (peers.empty ());
ASSERT_TRUE (network.empty ());
ASSERT_EQ (1, observed_peer);
ASSERT_TRUE (observed_disconnect);
}
Expand All @@ -47,15 +49,17 @@ TEST (peer_container, no_self_contacting)

TEST (peer_container, reserved_peers_no_contact)
{
nano::peer_container peers (nano::endpoint{});
nano::system system (24000, 1);
nano::peer_container & peers (system.nodes[0]->peers);
nano::network & network (system.nodes[0]->network);
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0x00000001)), 10000), 0));
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xc0000201)), 10000), 0));
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xc6336401)), 10000), 0));
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xcb007101)), 10000), 0));
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xe9fc0001)), 10000), 0));
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xf0000001)), 10000), 0));
ASSERT_TRUE (peers.insert (nano::endpoint (boost::asio::ip::address_v6::v4_mapped (boost::asio::ip::address_v4 (0xffffffff)), 10000), 0));
ASSERT_EQ (0, peers.size ());
ASSERT_EQ (0, network.size ());
}

TEST (peer_container, split)
Expand Down Expand Up @@ -146,8 +150,10 @@ TEST (peer_container, reachout)

TEST (peer_container, depeer)
{
nano::peer_container peers (nano::endpoint{});
nano::system system (24000, 1);
nano::peer_container & peers (system.nodes[0]->peers);
nano::network & network (system.nodes[0]->network);
nano::endpoint endpoint0 (boost::asio::ip::address_v6::loopback (), 24000);
peers.contacted (endpoint0, nano::protocol_version_min - 1);
ASSERT_EQ (0, peers.size ());
ASSERT_EQ (0, network.size ());
}
4 changes: 2 additions & 2 deletions nano/core_test/rpc.cpp
Expand Up @@ -1494,7 +1494,7 @@ TEST (rpc, keepalive)
request.put ("address", address);
request.put ("port", port);
ASSERT_FALSE (system.nodes[0]->peers.known_peer (node1->network.endpoint ()));
ASSERT_EQ (0, system.nodes[0]->peers.size ());
ASSERT_EQ (0, system.nodes[0]->network.size ());
test_response response (request, rpc, system.io_ctx);
system.deadline_set (5s);
while (response.status == 0)
Expand All @@ -1505,7 +1505,7 @@ TEST (rpc, keepalive)
system.deadline_set (10s);
while (!system.nodes[0]->peers.known_peer (node1->network.endpoint ()))
{
ASSERT_EQ (0, system.nodes[0]->peers.size ());
ASSERT_EQ (0, system.nodes[0]->network.size ());
ASSERT_NO_ERROR (system.poll ());
}
node1->stop ();
Expand Down
17 changes: 16 additions & 1 deletion nano/node/node.cpp
Expand Up @@ -1902,7 +1902,7 @@ void nano::node::ongoing_bootstrap ()
{
// Re-attempt bootstrapping more aggressively on startup
next_wakeup = 5;
if (!bootstrap_initiator.in_progress () && !peers.empty ())
if (!bootstrap_initiator.in_progress () && !network.empty ())
{
++warmed_up;
}
Expand Down Expand Up @@ -2599,6 +2599,21 @@ void nano::network::ongoing_cleanup ()
});
}

size_t nano::network::size ()
{
return node.peers.size ();
}

size_t nano::network::size_sqrt ()
{
return (static_cast<size_t> (std::ceil (std::sqrt (size ()))));
}

bool nano::network::empty ()
{
return size () == 0;
}

bool nano::block_arrival::add (nano::block_hash const & hash_a)
{
std::lock_guard<std::mutex> lock (mutex);
Expand Down
3 changes: 3 additions & 0 deletions nano/node/node.hpp
Expand Up @@ -345,6 +345,9 @@ class network
nano::endpoint endpoint ();
void cleanup (std::chrono::steady_clock::time_point const &);
void ongoing_cleanup ();
size_t size ();
size_t size_sqrt ();
bool empty ();
nano::message_buffer_manager buffer_container;
boost::asio::ip::udp::socket socket;
std::mutex socket_mutex;
Expand Down
9 changes: 6 additions & 3 deletions nano/node/peers.hpp
Expand Up @@ -18,6 +18,7 @@

namespace nano
{
class network;
nano::endpoint map_endpoint_to_v6 (nano::endpoint const &);

/** Multi-index helper */
Expand Down Expand Up @@ -60,6 +61,11 @@ class peer_information
/** Manages a set of disovered peers */
class peer_container
{
friend class nano::network;
size_t size ();
size_t size_sqrt ();
bool empty ();

public:
peer_container (nano::endpoint const &);
// We were contacted by endpoint, update peers
Expand Down Expand Up @@ -93,9 +99,6 @@ class peer_container
// Returns false if valid, true if invalid (true on error convention)
// Also removes the syn cookie from the store if valid
bool validate_syn_cookie (nano::endpoint const &, nano::account, nano::signature);
size_t size ();
size_t size_sqrt ();
bool empty ();
nano::network_params network_params;
std::mutex mutex;
nano::endpoint self;
Expand Down
8 changes: 4 additions & 4 deletions nano/node/testing.cpp
Expand Up @@ -43,16 +43,16 @@ work (1, nullptr)
}
for (auto i (nodes.begin ()), j (nodes.begin () + 1), n (nodes.end ()); j != n; ++i, ++j)
{
auto starting1 ((*i)->peers.size ());
auto starting1 ((*i)->network.size ());
decltype (starting1) new1;
auto starting2 ((*j)->peers.size ());
auto starting2 ((*j)->network.size ());
decltype (starting2) new2;
(*j)->network.send_keepalive ((*i)->network.endpoint ());
do
{
poll ();
new1 = (*i)->peers.size ();
new2 = (*j)->peers.size ();
new1 = (*i)->network.size ();
new2 = (*j)->network.size ();
} while (new1 == starting1 || new2 == starting2);
}
auto iterations1 (0);
Expand Down
2 changes: 1 addition & 1 deletion nano/qt/qt.cpp
Expand Up @@ -1427,7 +1427,7 @@ void nano_qt::wallet::refresh ()

void nano_qt::wallet::update_connected ()
{
if (node.peers.empty ())
if (node.network.empty ())
{
active_status.insert (nano_qt::status_types::disconnected);
}
Expand Down

0 comments on commit ef9426c

Please sign in to comment.