diff --git a/libraries/chain/controller.cpp b/libraries/chain/controller.cpp index 8eed9c896a..9a8329c295 100644 --- a/libraries/chain/controller.cpp +++ b/libraries/chain/controller.cpp @@ -1371,6 +1371,8 @@ struct controller_impl { savanna_transistion_required = true; // Do not advance irreversible past IF Genesis Block break; + } else if ((*bitr)->block->is_proper_svnn_block()) { + fork_db.switch_to_savanna(); } } } catch( std::exception& ) { @@ -1927,9 +1929,6 @@ struct controller_impl { [&](const block_state_legacy_ptr& head) -> block_state_pair { if (fork_db.version_in_use() == fork_database::in_use_t::both) { return fork_db.apply_s([&](const auto& forkdb) -> block_state_pair { - if (forkdb.root()->header.is_proper_svnn_block()) { - return { {}, forkdb.head() }; // legacy not needed past transition - } return { head, forkdb.head() }; }); } diff --git a/libraries/chain/fork_database.cpp b/libraries/chain/fork_database.cpp index e6ecf7761b..5bafbd03e9 100644 --- a/libraries/chain/fork_database.cpp +++ b/libraries/chain/fork_database.cpp @@ -686,13 +686,8 @@ namespace eosio::chain { wlog( "fork_database is in a bad state when closing; not writing out '${filename}', legacy_valid=${l}, savanna_valid=${s}", ("filename", fork_db_file)("l", legacy_valid)("s", savanna_valid) ); return; - } else if (legacy_valid && savanna_valid) { - // don't write legacy if not needed - assert(fork_db_s.root() && fork_db_s.root()->block); - if (fork_db_s.root()->block->is_proper_svnn_block()) { - legacy_valid = false; - in_use_value = in_use_t::savanna; - } + } else if (legacy_valid && savanna_valid && in_use_value == in_use_t::savanna) { + legacy_valid = false; // don't write legacy if not needed, we delay 'clear' of legacy until close } assert( (legacy_valid && (in_use_value == in_use_t::legacy)) || (savanna_valid && (in_use_value == in_use_t::savanna)) || @@ -804,6 +799,11 @@ namespace eosio::chain { } } + // only called from the main thread + void fork_database::switch_to_savanna() { + in_use = in_use_t::savanna; + } + block_branch_t fork_database::fetch_branch_from_head() const { return apply([&](auto& forkdb) { return forkdb.fetch_block_branch(forkdb.head()->id()); diff --git a/libraries/chain/include/eosio/chain/fork_database.hpp b/libraries/chain/include/eosio/chain/fork_database.hpp index d08fad1c96..4795cf5fa8 100644 --- a/libraries/chain/include/eosio/chain/fork_database.hpp +++ b/libraries/chain/include/eosio/chain/fork_database.hpp @@ -156,6 +156,7 @@ namespace eosio::chain { // switches to using both legacy and savanna during transition void switch_from_legacy(const block_state_ptr& root); + void switch_to_savanna(); in_use_t version_in_use() const { return in_use.load(); }