From 69b00293d94bd3901132078e92b38bf608259213 Mon Sep 17 00:00:00 2001 From: Eric Frias Date: Thu, 7 Sep 2017 15:55:44 -0400 Subject: [PATCH] Only do slow replays when the bookie plugin is loaded --- libraries/chain/db_management.cpp | 43 +++++++++++++------ .../chain/include/graphene/chain/database.hpp | 4 ++ libraries/plugins/bookie/bookie_plugin.cpp | 1 + 3 files changed, 36 insertions(+), 12 deletions(-) diff --git a/libraries/chain/db_management.cpp b/libraries/chain/db_management.cpp index dbfac40d..6bcee4bd 100644 --- a/libraries/chain/db_management.cpp +++ b/libraries/chain/db_management.cpp @@ -64,13 +64,16 @@ void database::reindex(fc::path data_dir, const genesis_state_type& initial_allo const auto last_block_num = last_block->block_num(); ilog( "Replaying blocks..." ); - // Right now, we leave undo_db enabled when replaying because the bookie plugin - // depends on new/changed/removed object notifications, and those are only fired - // when the undo_db is enabled - //_undo_db.disable(); + // Right now, we leave undo_db enabled when replaying when the bookie plugin is + // enabled. It depends on new/changed/removed object notifications, and those are + // only fired when the undo_db is enabled + if (!_slow_replays) + _undo_db.disable(); for( uint32_t i = 1; i <= last_block_num; ++i ) { - if( i % 10000 == 0 ) std::cerr << " " << double(i*100)/last_block_num << "% "< block = _block_id_to_block.fetch_by_number(i); if( !block.valid() ) { @@ -91,14 +94,24 @@ void database::reindex(fc::path data_dir, const genesis_state_type& initial_allo wlog( "Dropped ${n} blocks from after the gap", ("n", dropped_count) ); break; } - apply_block(*block, skip_witness_signature | - skip_transaction_signatures | - skip_transaction_dupe_check | - skip_tapos_check | - skip_witness_schedule_check | - skip_authority_check); + if (_slow_replays) + push_block(*block, skip_fork_db | + skip_witness_signature | + skip_transaction_signatures | + skip_transaction_dupe_check | + skip_tapos_check | + skip_witness_schedule_check | + skip_authority_check); + else + apply_block(*block, skip_witness_signature | + skip_transaction_signatures | + skip_transaction_dupe_check | + skip_tapos_check | + skip_witness_schedule_check | + skip_authority_check); } - //_undo_db.enable(); + if (!_slow_replays) + _undo_db.enable(); auto end = fc::time_point::now(); ilog( "Done reindexing, elapsed time: ${t} sec", ("t",double((end-start).count())/1000000.0 ) ); } FC_CAPTURE_AND_RETHROW( (data_dir) ) } @@ -189,4 +202,10 @@ void database::close(bool rewind) _fork_db.reset(); } +void database::force_slow_replays() +{ + ilog("enabling slow replays"); + _slow_replays = true; +} + } } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 7ccf99b9..00103d49 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -180,6 +180,9 @@ namespace graphene { namespace chain { // history object so other plugins that evaluate later can reference it. vector >& get_applied_operations(); + // the bookie plugin depends on change notifications that are skipped during normal replays + void force_slow_replays(); + string to_pretty_string( const asset& a )const; /** @@ -534,6 +537,7 @@ namespace graphene { namespace chain { node_property_object _node_property_object; fc::hash_ctr_rng _random_number_generator; + bool _slow_replays = false; }; namespace detail diff --git a/libraries/plugins/bookie/bookie_plugin.cpp b/libraries/plugins/bookie/bookie_plugin.cpp index 29ee69af..0932ddf3 100644 --- a/libraries/plugins/bookie/bookie_plugin.cpp +++ b/libraries/plugins/bookie/bookie_plugin.cpp @@ -453,6 +453,7 @@ void bookie_plugin::plugin_set_program_options(boost::program_options::options_d void bookie_plugin::plugin_initialize(const boost::program_options::variables_map& options) { ilog("bookie plugin: plugin_startup() begin"); + database().force_slow_replays(); database().applied_block.connect( [&]( const signed_block& b){ my->on_block_applied(b); } ); database().changed_objects.connect([&](const vector& changed_object_ids, const fc::flat_set& impacted_accounts){ my->on_objects_changed(changed_object_ids); }); database().new_objects.connect([this](const vector& ids, const flat_set& impacted_accounts) { my->on_objects_new(ids); });