From 865a24b121b1e6589c71475e480a19b95f3efeef Mon Sep 17 00:00:00 2001 From: clemahieu Date: Sat, 1 Apr 2017 16:39:46 -0500 Subject: [PATCH] Serializing confirm_ack messages only once per broadcast. --- rai/core_test/node.cpp | 9 ++++++++- rai/node/node.cpp | 36 +++++++++++++++++++----------------- rai/node/node.hpp | 3 +-- 3 files changed, 28 insertions(+), 20 deletions(-) diff --git a/rai/core_test/node.cpp b/rai/core_test/node.cpp index 121f4c7a..ab3b55e6 100644 --- a/rai/core_test/node.cpp +++ b/rai/core_test/node.cpp @@ -1017,7 +1017,14 @@ TEST (node, fork_no_vote_quorum) rai::send_block send2 (block->hash (), key2, (rai::genesis_amount / 4) - (node1.config.receive_minimum.number () * 2), rai::test_genesis_key.prv, rai::test_genesis_key.pub, system.work.generate (block->hash ())); rai::raw_key key3; ASSERT_FALSE (system.wallet (1)->store.fetch (rai::transaction (system.wallet (1)->store.environment, nullptr, false), key1, key3)); - node2.network.confirm_block (key3, key1, send2.clone (), 0, node3.network.endpoint ()); + rai::vote vote (key1, key3, 0, send2.clone ()); + rai::confirm_ack confirm (vote); + std::shared_ptr > bytes (new std::vector ); + { + rai::vectorstream stream (*bytes); + confirm.serialize (stream); + } + node2.network.confirm_block (confirm, bytes, node3.network.endpoint ()); while (node3.network.confirm_ack_count < 3) { system.poll (); diff --git a/rai/node/node.cpp b/rai/node/node.cpp index 1340bfd9..f824cd76 100755 --- a/rai/node/node.cpp +++ b/rai/node/node.cpp @@ -169,9 +169,16 @@ bool confirm_broadcast (rai::node & node_a, T & list_a, std::unique_ptr clone ()); + rai::confirm_ack confirm (vote); + std::shared_ptr > bytes (new std::vector ); + { + rai::vectorstream stream (*bytes); + confirm.serialize (stream); + } for (auto j (list_a.begin ()), m (list_a.end ()); j != m; ++j) { - node_a.network.confirm_block (prv_a, pub_a, block_a->clone (), sequence, j->endpoint); + node_a.network.confirm_block (confirm, bytes, j->endpoint); result = true; } }); @@ -189,7 +196,14 @@ bool confirm_broadcast (rai::node & node_a, rai::endpoint & peer_a, std::unique_ node_a.wallets.foreach_representative (transaction, [&result, &block_a, &peer_a, &node_a, &transaction] (rai::public_key const & pub_a, rai::raw_key const & prv_a) { auto sequence (node_a.store.sequence_atomic_inc (transaction, pub_a)); - node_a.network.confirm_block (prv_a, pub_a, block_a->clone (), sequence, peer_a); + rai::vote vote (pub_a, prv_a, sequence, block_a->clone ()); + rai::confirm_ack confirm (vote); + std::shared_ptr > bytes (new std::vector ); + { + rai::vectorstream stream (*bytes); + confirm.serialize (stream); + } + node_a.network.confirm_block (confirm, bytes, peer_a); result = true; }); } @@ -1195,26 +1209,14 @@ void rai::gap_cache::purge_old () } } -void rai::network::confirm_block (rai::raw_key const & prv, rai::public_key const & pub, std::unique_ptr block_a, uint64_t sequence_a, rai::endpoint const & endpoint_a) +void rai::network::confirm_block (rai::confirm_ack const & confirm_a, std::shared_ptr > bytes_a, rai::endpoint const & endpoint_a) { - rai::vote vote (pub, prv, sequence_a, std::move (block_a)); - confirm_block (vote, endpoint_a); -} - -void rai::network::confirm_block (rai::vote & vote_a, rai::endpoint const & endpoint_a) -{ - rai::confirm_ack confirm (vote_a); - std::shared_ptr > bytes (new std::vector ); - { - rai::vectorstream stream (*bytes); - confirm.serialize (stream); - } if (node.config.logging.network_publish_logging ()) { - BOOST_LOG (node.log) << boost::str (boost::format ("Sending confirm_ack for block %1% to %2%") % confirm.vote.block->hash ().to_string () % endpoint_a); + BOOST_LOG (node.log) << boost::str (boost::format ("Sending confirm_ack for block %1% to %2%") % confirm_a.vote.block->hash ().to_string () % endpoint_a); } std::weak_ptr node_w (node.shared ()); - node.network.send_buffer (bytes->data (), bytes->size (), endpoint_a, [bytes, node_w, endpoint_a] (boost::system::error_code const & ec, size_t size_a) + node.network.send_buffer (bytes_a->data (), bytes_a->size (), endpoint_a, [bytes_a, node_w, endpoint_a] (boost::system::error_code const & ec, size_t size_a) { if (auto node_l = node_w.lock ()) { diff --git a/rai/node/node.hpp b/rai/node/node.hpp index 0208b2ea..ca43e52c 100644 --- a/rai/node/node.hpp +++ b/rai/node/node.hpp @@ -271,8 +271,7 @@ public: void republish_block (rai::block &); void republish (rai::block_hash const &, std::shared_ptr >, rai::endpoint); void publish_broadcast (std::vector &, std::unique_ptr ); - void confirm_block (rai::raw_key const &, rai::public_key const &, std::unique_ptr , uint64_t, rai::endpoint const &); - void confirm_block (rai::vote &, rai::endpoint const &); + void confirm_block (rai::confirm_ack const &, std::shared_ptr >, rai::endpoint const &); void merge_peers (std::array const &); void send_keepalive (rai::endpoint const &); void broadcast_confirm_req (rai::block const &);