From fd4551f73af531e42239c0e7f7218287d5c075cb Mon Sep 17 00:00:00 2001 From: Sergey Kroshnin Date: Fri, 3 Jan 2020 19:42:06 +0300 Subject: [PATCH] Remove rolled back blocks list (#2447) * Remove rolled back blocks list * Don't stop initial rollback election --- nano/core_test/node.cpp | 27 --------------------------- nano/node/blockprocessor.cpp | 22 ++++++---------------- nano/node/blockprocessor.hpp | 11 ----------- nano/node/node.cpp | 3 --- 4 files changed, 6 insertions(+), 57 deletions(-) diff --git a/nano/core_test/node.cpp b/nano/core_test/node.cpp index 4f1842da..c01a6833 100644 --- a/nano/core_test/node.cpp +++ b/nano/core_test/node.cpp @@ -2810,33 +2810,6 @@ TEST (node, block_processor_reject_state) ASSERT_TRUE (node.ledger.block_exists (send2->hash ())); } -TEST (node, block_processor_reject_rolled_back) -{ - nano::system system; - nano::node_config node_config (nano::get_available_port (), system.logging); - node_config.frontiers_confirmation = nano::frontiers_confirmation_mode::disabled; - auto & node = *system.add_node (node_config); - nano::genesis genesis; - auto send1 (std::make_shared (nano::test_genesis_key.pub, genesis.hash (), nano::test_genesis_key.pub, nano::genesis_amount - nano::Gxrb_ratio, nano::test_genesis_key.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0)); - node.work_generate_blocking (*send1); - node.block_processor.add (send1); - node.block_processor.flush (); - ASSERT_TRUE (node.ledger.block_exists (send1->hash ())); - auto send2 (std::make_shared (nano::test_genesis_key.pub, genesis.hash (), nano::test_genesis_key.pub, nano::genesis_amount - 2 * nano::Gxrb_ratio, nano::test_genesis_key.pub, nano::test_genesis_key.prv, nano::test_genesis_key.pub, 0)); - node.work_generate_blocking (*send2); - // Force block send2 & rolling back block send1 - node.block_processor.force (send2); - node.block_processor.flush (); - ASSERT_FALSE (node.ledger.block_exists (send1->hash ())); - ASSERT_TRUE (node.ledger.block_exists (send2->hash ())); - ASSERT_TRUE (node.active.empty ()); - // Block send1 cannot be processed & start fork resolution election - node.block_processor.add (send1); - node.block_processor.flush (); - ASSERT_FALSE (node.ledger.block_exists (send1->hash ())); - ASSERT_TRUE (node.active.empty ()); -} - TEST (node, block_processor_full) { nano::system system; diff --git a/nano/node/blockprocessor.cpp b/nano/node/blockprocessor.cpp index 7cd22a1d..19e293bb 100644 --- a/nano/node/blockprocessor.cpp +++ b/nano/node/blockprocessor.cpp @@ -75,7 +75,7 @@ void nano::block_processor::add (nano::unchecked_info const & info_a) auto hash (info_a.block->hash ()); auto filter_hash (filter_item (hash, info_a.block->block_signature ())); nano::lock_guard lock (mutex); - if (blocks_filter.find (filter_hash) == blocks_filter.end () && rolled_back.get ().find (hash) == rolled_back.get ().end ()) + if (blocks_filter.find (filter_hash) == blocks_filter.end ()) { if (info_a.verified == nano::signature_verification::unknown && (info_a.block->type () == nano::block_type::state || info_a.block->type () == nano::block_type::open || !info_a.account.is_zero ())) { @@ -326,26 +326,16 @@ void nano::block_processor::process_batch (nano::unique_lock & lock_ { node.logger.always_log (boost::str (boost::format ("%1% blocks rolled back") % rollback_list.size ())); } - lock_a.lock (); - // Prevent rolled back blocks second insertion - auto inserted (rolled_back.get ().push_back (successor->hash ())); - if (inserted.second) - { - // Possible election winner change - rolled_back.get ().erase (hash); - // Prevent overflow - if (rolled_back.size () > rolled_back_max) - { - rolled_back.get ().pop_front (); - } - } - lock_a.unlock (); // Deleting from votes cache & wallet work watcher, stop active transaction for (auto & i : rollback_list) { node.votes_cache.remove (i->hash ()); node.wallets.watcher->remove (i); - node.active.erase (*i); + // Stop all rolled back active transactions except initial + if (i->hash () != successor->hash ()) + { + node.active.erase (*i); + } } } } diff --git a/nano/node/blockprocessor.hpp b/nano/node/blockprocessor.hpp index ecb3d773..b4a73b10 100644 --- a/nano/node/blockprocessor.hpp +++ b/nano/node/blockprocessor.hpp @@ -63,17 +63,6 @@ private: std::deque> forced; nano::block_hash filter_item (nano::block_hash const &, nano::signature const &); std::unordered_set blocks_filter; - // clang-format off - class tag_sequence {}; - class tag_hash {}; - boost::multi_index_container>, - boost::multi_index::hashed_unique, - boost::multi_index::identity>>> - rolled_back; - // clang-format on - static size_t const rolled_back_max = 1024; nano::condition_variable condition; nano::node & node; nano::write_database_queue & write_database_queue; diff --git a/nano/node/node.cpp b/nano/node/node.cpp index 3aa11b83..651e152a 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -86,7 +86,6 @@ std::unique_ptr collect_seq_con_info (block_processor & size_t blocks_count = 0; size_t blocks_filter_count = 0; size_t forced_count = 0; - size_t rolled_back_count = 0; { nano::lock_guard guard (block_processor.mutex); @@ -94,7 +93,6 @@ std::unique_ptr collect_seq_con_info (block_processor & blocks_count = block_processor.blocks.size (); blocks_filter_count = block_processor.blocks_filter.size (); forced_count = block_processor.forced.size (); - rolled_back_count = block_processor.rolled_back.size (); } auto composite = std::make_unique (name); @@ -102,7 +100,6 @@ std::unique_ptr collect_seq_con_info (block_processor & composite->add_component (std::make_unique (seq_con_info{ "blocks", blocks_count, sizeof (decltype (block_processor.blocks)::value_type) })); composite->add_component (std::make_unique (seq_con_info{ "blocks_filter", blocks_filter_count, sizeof (decltype (block_processor.blocks_filter)::value_type) })); composite->add_component (std::make_unique (seq_con_info{ "forced", forced_count, sizeof (decltype (block_processor.forced)::value_type) })); - composite->add_component (std::make_unique (seq_con_info{ "rolled_back", rolled_back_count, sizeof (decltype (block_processor.rolled_back)::value_type) })); composite->add_component (collect_seq_con_info (block_processor.generator, "generator")); return composite; }