diff --git a/libraries/chain/db_block.cpp b/libraries/chain/db_block.cpp index 67601c2e..c2744050 100644 --- a/libraries/chain/db_block.cpp +++ b/libraries/chain/db_block.cpp @@ -585,14 +585,16 @@ signed_block database::_generate_block( * Removes the most recent block from the database and * undoes any changes it made. */ -void database::pop_block() +void database::pop_block(bool check) { try { _pending_tx_session.reset(); auto head_id = head_block_id(); optional head_block = fetch_block_by_id( head_id ); GRAPHENE_ASSERT( head_block.valid(), pop_empty_chain, "there are no blocks to pop" ); - _fork_db.pop_block(); + ilog( "head_block is ${dump}", ("dump", head_block) ); + + _fork_db.pop_block(check); pop_undo(); _popped_tx.insert( _popped_tx.begin(), head_block->transactions.begin(), head_block->transactions.end() ); diff --git a/libraries/chain/db_management.cpp b/libraries/chain/db_management.cpp index 2ca49c4c..5e6439d5 100644 --- a/libraries/chain/db_management.cpp +++ b/libraries/chain/db_management.cpp @@ -259,11 +259,12 @@ void database::close(bool rewind) try { uint32_t cutoff = get_dynamic_global_properties().last_irreversible_block_num; - + //ilog("cutoff = ${c}", ("c", cutoff)); while( head_block_num() > cutoff ) { + //ilog("head_block_num() = ${id}", ("id", head_block_num())); block_id_type popped_block_id = head_block_id(); - pop_block(); + pop_block( head_block_num() == cutoff + 1 ? false : true); _fork_db.remove(popped_block_id); // doesn't throw on missing } } diff --git a/libraries/chain/fork_database.cpp b/libraries/chain/fork_database.cpp index 1cb4f77b..6345f555 100644 --- a/libraries/chain/fork_database.cpp +++ b/libraries/chain/fork_database.cpp @@ -35,11 +35,13 @@ void fork_database::reset() _index.clear(); } -void fork_database::pop_block() +void fork_database::pop_block(bool check) { FC_ASSERT( _head, "no blocks to pop" ); auto prev = _head->prev.lock(); - FC_ASSERT( prev, "poping block would leave head block null" ); + if (check){ + FC_ASSERT( prev, "poping block would leave head block null" ); + } _head = prev; } diff --git a/libraries/chain/include/graphene/chain/database.hpp b/libraries/chain/include/graphene/chain/database.hpp index 50975174..4a7454c1 100644 --- a/libraries/chain/include/graphene/chain/database.hpp +++ b/libraries/chain/include/graphene/chain/database.hpp @@ -163,7 +163,7 @@ namespace graphene { namespace chain { const fc::ecc::private_key& block_signing_private_key ); - void pop_block(); + void pop_block(bool check = true); void clear_pending(); /** diff --git a/libraries/chain/include/graphene/chain/fork_database.hpp b/libraries/chain/include/graphene/chain/fork_database.hpp index 4007ca09..45e0d2c7 100644 --- a/libraries/chain/include/graphene/chain/fork_database.hpp +++ b/libraries/chain/include/graphene/chain/fork_database.hpp @@ -92,7 +92,7 @@ namespace graphene { namespace chain { */ shared_ptr push_block(const signed_block& b); shared_ptr head()const { return _head; } - void pop_block(); + void pop_block(bool check); /** * Given two head blocks, return two branches of the fork graph that