Consistently add conflicting block to election (#2652)

* Add conflicting block after creating the election

* Add a test ensuring correct behavior
This commit is contained in:
Guilherme Lawless 2020-03-26 17:57:20 +00:00 committed by GitHub
commit b276aff086
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 1 deletions

View file

@ -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<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 ())));
auto send2 (std::make_shared<nano::send_block> (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<std::mutex> 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);

View file

@ -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<nano::block> 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);
}
}