Updating work on a block was clobbering the successor which would break ledger::account

This commit is contained in:
clemahieu 2017-03-15 23:25:54 -05:00
commit b2b0b9b2e2
4 changed files with 17 additions and 13 deletions

View file

@ -631,18 +631,18 @@ TEST (node, block_replace)
{ {
rai::system system (24000, 2); rai::system system (24000, 2);
system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv); system.wallet (0)->insert_adhoc (rai::test_genesis_key.prv);
ASSERT_NE (nullptr, system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, 1000)); auto block1 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio));
std::unique_ptr <rai::block> block1; auto block3 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio));
{
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
block1 = system.nodes [0]->store.block_get (transaction, system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub));
}
ASSERT_NE (nullptr, block1); ASSERT_NE (nullptr, block1);
auto initial_work (block1->block_work ()); auto initial_work (block1->block_work ());
while (system.work.work_value (block1->root (), block1->block_work ()) <= system.work.work_value (block1->root (), initial_work)) while (system.work.work_value (block1->root (), block1->block_work ()) <= system.work.work_value (block1->root (), initial_work))
{ {
system.nodes [1]->generate_work (*block1); system.nodes [1]->generate_work (*block1);
} }
{
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
ASSERT_EQ (block3->hash (), system.nodes [0]->store.block_successor (transaction, block1->hash ()));
}
system.nodes [1]->network.republish_block (*block1, 0); system.nodes [1]->network.republish_block (*block1, 0);
auto iterations1 (0); auto iterations1 (0);
std::unique_ptr <rai::block> block2; std::unique_ptr <rai::block> block2;
@ -652,12 +652,16 @@ TEST (node, block_replace)
++iterations1; ++iterations1;
ASSERT_LT (iterations1, 200); ASSERT_LT (iterations1, 200);
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false); rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
auto block (system.nodes [0]->store.block_get (transaction, system.nodes [0]->ledger.latest (transaction, rai::test_genesis_key.pub))); auto block (system.nodes [0]->store.block_get (transaction, block1->hash ()));
if (block->block_work () != initial_work) if (block->block_work () != initial_work)
{ {
block2 = std::move (block); block2 = std::move (block);
} }
} }
{
rai::transaction transaction (system.nodes [0]->store.environment, nullptr, false);
ASSERT_EQ (block3->hash (), system.nodes [0]->store.block_successor(transaction, block1->hash ()));
}
ASSERT_NE (initial_work, block1->block_work ()); ASSERT_NE (initial_work, block1->block_work ());
ASSERT_EQ (block1->block_work (), block2->block_work ()); ASSERT_EQ (block1->block_work (), block2->block_work ());
ASSERT_GT (system.work.work_value (block2->root (), block2->block_work ()), system.work.work_value (block1->root (), initial_work)); ASSERT_GT (system.work.work_value (block2->root (), block2->block_work ()), system.work.work_value (block1->root (), initial_work));

View file

@ -1303,7 +1303,7 @@ rai::process_return rai::node::process_receive_one (MDB_txn * transaction_a, rai
// Replace block with one that has higher work value // Replace block with one that has higher work value
if (work.work_value (root, block_a.block_work ()) > work.work_value (root, existing->block_work ())) if (work.work_value (root, block_a.block_work ()) > work.work_value (root, existing->block_work ()))
{ {
store.block_put (transaction_a, hash, block_a); store.block_put (transaction_a, hash, block_a, store.block_successor (transaction_a, hash));
} }
} }
else else

View file

@ -1773,14 +1773,14 @@ void rai::block_store::block_put_raw (MDB_txn * transaction_a, MDB_dbi database_
assert (status2 == 0); assert (status2 == 0);
} }
void rai::block_store::block_put (MDB_txn * transaction_a, rai::block_hash const & hash_a, rai::block const & block_a) void rai::block_store::block_put (MDB_txn * transaction_a, rai::block_hash const & hash_a, rai::block const & block_a, rai::block_hash const & successor_a)
{ {
assert (successor_a.is_zero () || block_exists (transaction_a, successor_a));
std::vector <uint8_t> vector; std::vector <uint8_t> vector;
{ {
rai::vectorstream stream (vector); rai::vectorstream stream (vector);
block_a.serialize (stream); block_a.serialize (stream);
rai::block_hash successor (0); rai::write (stream, successor_a.bytes);
rai::write (stream, successor.bytes);
} }
block_put_raw (transaction_a, block_database (block_a.type ()), hash_a, {vector.size (), vector.data ()}); block_put_raw (transaction_a, block_database (block_a.type ()), hash_a, {vector.size (), vector.data ()});
set_predecessor predecessor (transaction_a, *this); set_predecessor predecessor (transaction_a, *this);

View file

@ -324,7 +324,7 @@ public:
MDB_dbi block_database (rai::block_type); MDB_dbi block_database (rai::block_type);
void block_put_raw (MDB_txn *, MDB_dbi, rai::block_hash const &, MDB_val); void block_put_raw (MDB_txn *, MDB_dbi, rai::block_hash const &, MDB_val);
void block_put (MDB_txn *, rai::block_hash const &, rai::block const &); void block_put (MDB_txn *, rai::block_hash const &, rai::block const &, rai::block_hash const & = rai::block_hash (0));
MDB_val block_get_raw (MDB_txn *, rai::block_hash const &, rai::block_type &); MDB_val block_get_raw (MDB_txn *, rai::block_hash const &, rai::block_type &);
rai::block_hash block_successor (MDB_txn *, rai::block_hash const &); rai::block_hash block_successor (MDB_txn *, rai::block_hash const &);
void block_successor_clear (MDB_txn *, rai::block_hash const &); void block_successor_clear (MDB_txn *, rai::block_hash const &);