Non recursive amount (#778)

* Convert recursive amount calculation to iterative.

* Only computing balance if it can't be retrieved by block_info.
This commit is contained in:
clemahieu 2018-04-03 16:11:11 -05:00 committed by GitHub
commit 67d211569f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 21 deletions

View file

@ -421,22 +421,24 @@ void rai::amount_visitor::send_block (rai::send_block const & block_a)
balance_visitor prev (transaction, store);
prev.compute (block_a.hashables.previous);
result = prev.result - block_a.hashables.balance.number ();
current = 0;
}
void rai::amount_visitor::receive_block (rai::receive_block const & block_a)
{
from_send (block_a.hashables.source);
current = block_a.hashables.source;
}
void rai::amount_visitor::open_block (rai::open_block const & block_a)
{
if (block_a.hashables.source != rai::genesis_account)
{
from_send (block_a.hashables.source);
current = block_a.hashables.source;
}
else
{
result = rai::genesis_amount;
current = 0;
}
}
@ -446,37 +448,38 @@ void rai::amount_visitor::state_block (rai::state_block const & block_a)
prev.compute (block_a.hashables.previous);
result = block_a.hashables.balance.number ();
result = result < prev.result ? prev.result - result : result - prev.result;
current = 0;
}
void rai::amount_visitor::change_block (rai::change_block const & block_a)
{
result = 0;
}
void rai::amount_visitor::from_send (rai::block_hash const & hash_a)
{
auto source_block (store.block_get (transaction, hash_a));
assert (source_block != nullptr);
source_block->visit (*this);
current = 0;
}
void rai::amount_visitor::compute (rai::block_hash const & block_hash)
{
auto block (store.block_get (transaction, block_hash));
if (block != nullptr)
current = block_hash;
while (!current.is_zero ())
{
block->visit (*this);
}
else
{
if (block_hash == rai::genesis_account)
auto block (store.block_get (transaction, current));
if (block != nullptr)
{
result = std::numeric_limits<rai::uint128_t>::max ();
block->visit (*this);
}
else
{
assert (false);
result = 0;
if (block_hash == rai::genesis_account)
{
result = std::numeric_limits<rai::uint128_t>::max ();
current = 0;
}
else
{
assert (false);
result = 0;
current = 0;
}
}
}
}
@ -497,8 +500,6 @@ void rai::balance_visitor::send_block (rai::send_block const & block_a)
void rai::balance_visitor::receive_block (rai::receive_block const & block_a)
{
amount_visitor source (transaction, store);
source.compute (block_a.hashables.source);
rai::block_info block_info;
if (!store.block_info_get (transaction, block_a.hash (), block_info))
{
@ -507,6 +508,8 @@ void rai::balance_visitor::receive_block (rai::receive_block const & block_a)
}
else
{
amount_visitor source (transaction, store);
source.compute (block_a.hashables.source);
result += source.result;
current = block_a.hashables.previous;
}

View file

@ -61,6 +61,7 @@ public:
void from_send (rai::block_hash const &);
MDB_txn * transaction;
rai::block_store & store;
rai::block_hash current;
rai::uint128_t result;
};