Fix CLI test --debug_profile_bootstrap (#2861)

* Fix CLI test --debug_profile_bootstrap
Adding blocks to wrong node
* Epoch open blocks can be rejected without processed pending blocks to account, push it later if required
This commit is contained in:
Sergey Kroshnin 2020-08-03 20:51:27 +03:00 committed by GitHub
commit 3bf669e541
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -1741,13 +1741,14 @@ int main (int argc, char * const * argv)
auto begin (std::chrono::high_resolution_clock::now ()); auto begin (std::chrono::high_resolution_clock::now ());
uint64_t block_count (0); uint64_t block_count (0);
size_t count (0); size_t count (0);
std::deque<nano::unchecked_info> epoch_open_blocks;
{ {
auto inactive_node = nano::default_inactive_node (data_path, vm); auto inactive_node = nano::default_inactive_node (data_path, vm);
auto node = inactive_node->node; auto source_node = inactive_node->node;
auto transaction (node->store.tx_begin_read ()); auto transaction (source_node->store.tx_begin_read ());
block_count = node->ledger.cache.block_count; block_count = source_node->ledger.cache.block_count;
std::cout << boost::str (boost::format ("Performing bootstrap emulation, %1% blocks in ledger...") % block_count) << std::endl; std::cout << boost::str (boost::format ("Performing bootstrap emulation, %1% blocks in ledger...") % block_count) << std::endl;
for (auto i (node->store.latest_begin (transaction)), n (node->store.latest_end ()); i != n; ++i) for (auto i (source_node->store.latest_begin (transaction)), n (source_node->store.latest_end ()); i != n; ++i)
{ {
nano::account const & account (i->first); nano::account const & account (i->first);
nano::account_info const & info (i->second); nano::account_info const & info (i->second);
@ -1755,7 +1756,7 @@ int main (int argc, char * const * argv)
while (!hash.is_zero ()) while (!hash.is_zero ())
{ {
// Retrieving block data // Retrieving block data
auto block (node->store.block_get_no_sideband (transaction, hash)); auto block (source_node->store.block_get_no_sideband (transaction, hash));
if (block != nullptr) if (block != nullptr)
{ {
++count; ++count;
@ -1764,7 +1765,12 @@ int main (int argc, char * const * argv)
std::cout << boost::str (boost::format ("%1% blocks retrieved") % count) << std::endl; std::cout << boost::str (boost::format ("%1% blocks retrieved") % count) << std::endl;
} }
nano::unchecked_info unchecked_info (block, account, 0, nano::signature_verification::unknown); nano::unchecked_info unchecked_info (block, account, 0, nano::signature_verification::unknown);
node->block_processor.add (unchecked_info); node.node->block_processor.add (unchecked_info);
if (block->type () == nano::block_type::state && block->previous ().is_zero () && source_node->ledger.is_epoch_link (block->link ()))
{
// Epoch open blocks can be rejected without processed pending blocks to account, push it later again
epoch_open_blocks.push_back (unchecked_info);
}
// Retrieving previous block hash // Retrieving previous block hash
hash = block->previous (); hash = block->previous ();
} }
@ -1774,7 +1780,15 @@ int main (int argc, char * const * argv)
nano::timer<std::chrono::seconds> timer_l (nano::timer_state::started); nano::timer<std::chrono::seconds> timer_l (nano::timer_state::started);
while (node.node->ledger.cache.block_count != block_count) while (node.node->ledger.cache.block_count != block_count)
{ {
std::this_thread::sleep_for (std::chrono::milliseconds (50)); std::this_thread::sleep_for (std::chrono::milliseconds (500));
// Add epoch open blocks again if required
if (node.node->block_processor.size () == 0)
{
for (auto & unchecked_info : epoch_open_blocks)
{
node.node->block_processor.add (unchecked_info);
}
}
// Message each 60 seconds // Message each 60 seconds
if (timer_l.after_deadline (std::chrono::seconds (60))) if (timer_l.after_deadline (std::chrono::seconds (60)))
{ {