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);
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));
std::unique_ptr <rai::block> block1;
{
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);
auto block1 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio));
auto block3 (system.wallet (0)->send_action (rai::test_genesis_key.pub, 0, rai::Grai_ratio));
ASSERT_NE (nullptr, block1);
auto initial_work (block1->block_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);
}
{
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);
auto iterations1 (0);
std::unique_ptr <rai::block> block2;
@ -652,12 +652,16 @@ TEST (node, block_replace)
++iterations1;
ASSERT_LT (iterations1, 200);
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)
{
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_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));

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
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

View file

@ -1773,14 +1773,14 @@ void rai::block_store::block_put_raw (MDB_txn * transaction_a, MDB_dbi database_
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;
{
rai::vectorstream stream (vector);
block_a.serialize (stream);
rai::block_hash successor (0);
rai::write (stream, successor.bytes);
rai::write (stream, successor_a.bytes);
}
block_put_raw (transaction_a, block_database (block_a.type ()), hash_a, {vector.size (), vector.data ()});
set_predecessor predecessor (transaction_a, *this);

View file

@ -324,7 +324,7 @@ public:
MDB_dbi block_database (rai::block_type);
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 &);
rai::block_hash block_successor (MDB_txn *, rai::block_hash const &);
void block_successor_clear (MDB_txn *, rai::block_hash const &);