Extract rollback_competitor function and simplify proces_batch. (#4252)
This commit is contained in:
parent
54593ee2a7
commit
c7aa46557c
2 changed files with 37 additions and 29 deletions
|
|
@ -123,6 +123,40 @@ std::optional<nano::process_return> nano::block_processor::add_blocking (std::sh
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nano::block_processor::rollback_competitor (nano::write_transaction const & transaction, nano::block const & block)
|
||||||
|
{
|
||||||
|
auto hash = block.hash ();
|
||||||
|
auto successor = node.ledger.successor (transaction, block.qualified_root ());
|
||||||
|
if (successor != nullptr && successor->hash () != hash)
|
||||||
|
{
|
||||||
|
// Replace our block with the winner and roll back any dependent blocks
|
||||||
|
if (node.config.logging.ledger_rollback_logging ())
|
||||||
|
{
|
||||||
|
node.logger.always_log (boost::str (boost::format ("Rolling back %1% and replacing with %2%") % successor->hash ().to_string () % hash.to_string ()));
|
||||||
|
}
|
||||||
|
std::vector<std::shared_ptr<nano::block>> rollback_list;
|
||||||
|
if (node.ledger.rollback (transaction, successor->hash (), rollback_list))
|
||||||
|
{
|
||||||
|
node.stats.inc (nano::stat::type::ledger, nano::stat::detail::rollback_failed);
|
||||||
|
node.logger.always_log (nano::severity_level::error, boost::str (boost::format ("Failed to roll back %1% because it or a successor was confirmed") % successor->hash ().to_string ()));
|
||||||
|
}
|
||||||
|
else if (node.config.logging.ledger_rollback_logging ())
|
||||||
|
{
|
||||||
|
node.logger.always_log (boost::str (boost::format ("%1% blocks rolled back") % rollback_list.size ()));
|
||||||
|
}
|
||||||
|
// Deleting from votes cache, stop active transaction
|
||||||
|
for (auto & i : rollback_list)
|
||||||
|
{
|
||||||
|
node.history.erase (i->root ());
|
||||||
|
// Stop all rolled back active transactions except initial
|
||||||
|
if (i->hash () != successor->hash ())
|
||||||
|
{
|
||||||
|
node.active.erase (*i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void nano::block_processor::force (std::shared_ptr<nano::block> const & block_a)
|
void nano::block_processor::force (std::shared_ptr<nano::block> const & block_a)
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
|
|
@ -266,35 +300,7 @@ auto nano::block_processor::process_batch (nano::unique_lock<nano::mutex> & lock
|
||||||
lock_a.unlock ();
|
lock_a.unlock ();
|
||||||
if (force)
|
if (force)
|
||||||
{
|
{
|
||||||
auto successor = node.ledger.successor (transaction, block->qualified_root ());
|
rollback_competitor (transaction, *block);
|
||||||
if (successor != nullptr && successor->hash () != hash)
|
|
||||||
{
|
|
||||||
// Replace our block with the winner and roll back any dependent blocks
|
|
||||||
if (node.config.logging.ledger_rollback_logging ())
|
|
||||||
{
|
|
||||||
node.logger.always_log (boost::str (boost::format ("Rolling back %1% and replacing with %2%") % successor->hash ().to_string () % hash.to_string ()));
|
|
||||||
}
|
|
||||||
std::vector<std::shared_ptr<nano::block>> rollback_list;
|
|
||||||
if (node.ledger.rollback (transaction, successor->hash (), rollback_list))
|
|
||||||
{
|
|
||||||
node.stats.inc (nano::stat::type::ledger, nano::stat::detail::rollback_failed);
|
|
||||||
node.logger.always_log (nano::severity_level::error, boost::str (boost::format ("Failed to roll back %1% because it or a successor was confirmed") % successor->hash ().to_string ()));
|
|
||||||
}
|
|
||||||
else if (node.config.logging.ledger_rollback_logging ())
|
|
||||||
{
|
|
||||||
node.logger.always_log (boost::str (boost::format ("%1% blocks rolled back") % rollback_list.size ()));
|
|
||||||
}
|
|
||||||
// Deleting from votes cache, stop active transaction
|
|
||||||
for (auto & i : rollback_list)
|
|
||||||
{
|
|
||||||
node.history.erase (i->root ());
|
|
||||||
// Stop all rolled back active transactions except initial
|
|
||||||
if (i->hash () != successor->hash ())
|
|
||||||
{
|
|
||||||
node.active.erase (*i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
number_of_blocks_processed++;
|
number_of_blocks_processed++;
|
||||||
auto result = process_one (transaction, block, force);
|
auto result = process_one (transaction, block, force);
|
||||||
|
|
|
||||||
|
|
@ -54,6 +54,8 @@ private:
|
||||||
blocking_observer blocking;
|
blocking_observer blocking;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
// Roll back block in the ledger that conflicts with 'block'
|
||||||
|
void rollback_competitor (nano::write_transaction const & transaction, nano::block const & block);
|
||||||
nano::process_return process_one (nano::write_transaction const &, std::shared_ptr<nano::block> block, bool const = false);
|
nano::process_return process_one (nano::write_transaction const &, std::shared_ptr<nano::block> block, bool const = false);
|
||||||
void queue_unchecked (nano::write_transaction const &, nano::hash_or_account const &);
|
void queue_unchecked (nano::write_transaction const &, nano::hash_or_account const &);
|
||||||
std::deque<processed_t> process_batch (nano::unique_lock<nano::mutex> &);
|
std::deque<processed_t> process_batch (nano::unique_lock<nano::mutex> &);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue