diff --git a/nano/core_test/node.cpp b/nano/core_test/node.cpp index 83bd3ca7..17517efd 100644 --- a/nano/core_test/node.cpp +++ b/nano/core_test/node.cpp @@ -1256,6 +1256,30 @@ TEST (node, fork_publish) ASSERT_TRUE (node0.expired ()); } +// Tests that an election gets started correctly from a fork +TEST (node, fork_publish_inactive) +{ + nano::system system (1); + nano::genesis genesis; + nano::keypair key1; + nano::keypair key2; + auto send1 (std::make_shared (genesis.hash (), key1.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, *system.work.generate (genesis.hash ()))); + auto send2 (std::make_shared (genesis.hash (), key2.pub, nano::genesis_amount - 100, nano::test_genesis_key.prv, nano::test_genesis_key.pub, send1->block_work ())); + auto & node (*system.nodes[0]); + ASSERT_EQ (nano::process_result::progress, node.process (*send1).code); + ASSERT_EQ (nano::process_result::fork, node.process_local (send2).code); + auto election (node.active.election (send1->qualified_root ())); + ASSERT_NE (election, nullptr); + { + nano::lock_guard guard (node.active.mutex); + auto & blocks (election->blocks); + ASSERT_NE (blocks.end (), blocks.find (send1->hash ())); + ASSERT_NE (blocks.end (), blocks.find (send2->hash ())); + ASSERT_NE (election->status.winner, send1); + ASSERT_NE (election->status.winner, send2); + } +} + TEST (node, fork_keep) { nano::system system (2); diff --git a/nano/node/node.cpp b/nano/node/node.cpp index c3eed906..74e8db6a 100644 --- a/nano/node/node.cpp +++ b/nano/node/node.cpp @@ -532,7 +532,6 @@ void nano::node::process_fork (nano::transaction const & transaction_a, std::sha auto root (block_a->root ()); if (!store.block_exists (transaction_a, block_a->type (), block_a->hash ()) && store.root_exists (transaction_a, block_a->root ())) { - active.publish (block_a); std::shared_ptr ledger_block (ledger.forked_block (transaction_a, *block_a)); if (ledger_block && !block_confirmed_or_being_confirmed (transaction_a, ledger_block->hash ())) { @@ -562,6 +561,7 @@ void nano::node::process_fork (nano::transaction const & transaction_a, std::sha election.election->transition_active (); } } + active.publish (block_a); } }