From 937dad5a004e9fc0e899832e37554cba307ce3d2 Mon Sep 17 00:00:00 2001 From: Roy Keene Date: Wed, 2 Jan 2019 16:40:00 -0600 Subject: [PATCH] Slightly more efficient way of storing duplicates (#1364) --- nano/core_test/network.cpp | 51 ++++++++++++++++++++++++++------------ nano/node/bootstrap.cpp | 4 +-- nano/node/bootstrap.hpp | 2 +- 3 files changed, 37 insertions(+), 20 deletions(-) diff --git a/nano/core_test/network.cpp b/nano/core_test/network.cpp index 7fafdf96..b6a44572 100644 --- a/nano/core_test/network.cpp +++ b/nano/core_test/network.cpp @@ -1256,20 +1256,39 @@ TEST (bulk_pull_account, basics) ASSERT_NO_ERROR (system.poll ()); } auto connection (std::make_shared (nullptr, system.nodes[0])); - std::unique_ptr req (new nano::bulk_pull_account{}); - req->account = key1.pub; - req->minimum_amount = 5; - req->flags = nano::bulk_pull_account_flags (); - connection->requests.push (std::unique_ptr{}); - auto request (std::make_shared (connection, std::move (req))); - ASSERT_FALSE (request->invalid_request); - ASSERT_FALSE (request->pending_include_address); - ASSERT_FALSE (request->pending_address_only); - ASSERT_EQ (request->current_key.account, key1.pub); - ASSERT_EQ (request->current_key.hash, 0); - auto block_data (request->get_next ()); - ASSERT_EQ (send2->hash (), block_data.first.get ()->hash); - ASSERT_EQ (nano::uint128_union (10), block_data.second.get ()->amount); - ASSERT_EQ (nano::genesis_account, block_data.second.get ()->source); - ASSERT_EQ (nullptr, request->get_next ().first.get ()); + + { + std::unique_ptr req (new nano::bulk_pull_account{}); + req->account = key1.pub; + req->minimum_amount = 5; + req->flags = nano::bulk_pull_account_flags (); + connection->requests.push (std::unique_ptr{}); + auto request (std::make_shared (connection, std::move (req))); + ASSERT_FALSE (request->invalid_request); + ASSERT_FALSE (request->pending_include_address); + ASSERT_FALSE (request->pending_address_only); + ASSERT_EQ (request->current_key.account, key1.pub); + ASSERT_EQ (request->current_key.hash, 0); + auto block_data (request->get_next ()); + ASSERT_EQ (send2->hash (), block_data.first.get ()->hash); + ASSERT_EQ (nano::uint128_union (10), block_data.second.get ()->amount); + ASSERT_EQ (nano::genesis_account, block_data.second.get ()->source); + ASSERT_EQ (nullptr, request->get_next ().first.get ()); + } + + { + std::unique_ptr req (new nano::bulk_pull_account{}); + req->account = key1.pub; + req->minimum_amount = 0; + req->flags = nano::bulk_pull_account_flags::pending_address_only; + auto request (std::make_shared (connection, std::move (req))); + ASSERT_TRUE (request->pending_address_only); + auto block_data (request->get_next ()); + ASSERT_NE (nullptr, block_data.first.get ()); + ASSERT_NE (nullptr, block_data.second.get ()); + ASSERT_EQ (nano::genesis_account, block_data.second.get ()->source); + block_data = request->get_next (); + ASSERT_EQ (nullptr, block_data.first.get ()); + ASSERT_EQ (nullptr, block_data.second.get ()); + } } diff --git a/nano/node/bootstrap.cpp b/nano/node/bootstrap.cpp index 3ad2e1c7..54298aac 100644 --- a/nano/node/bootstrap.cpp +++ b/nano/node/bootstrap.cpp @@ -2433,7 +2433,7 @@ std::pair, std::unique_ptr, std::unique_ptr (new nano::pending_key (key)); diff --git a/nano/node/bootstrap.hpp b/nano/node/bootstrap.hpp index 2c74a623..e10637ac 100644 --- a/nano/node/bootstrap.hpp +++ b/nano/node/bootstrap.hpp @@ -289,7 +289,7 @@ public: std::shared_ptr connection; std::unique_ptr request; std::shared_ptr> send_buffer; - std::unordered_map deduplication; + std::unordered_set deduplication; nano::pending_key current_key; bool pending_address_only; bool pending_include_address;