diff options
author | Fabian Jahr <fjahr@protonmail.com> | 2024-06-18 14:24:55 +0200 |
---|---|---|
committer | Fabian Jahr <fjahr@protonmail.com> | 2024-06-19 22:32:33 +0200 |
commit | 80315c011863d69e7785673283e4c9033fbcd5ac (patch) | |
tree | f316c62c3aa2fe1f9ce27c4d4f1e92d7953efe28 /src/validation.cpp | |
parent | 9c5cdf07f30f816cd134e2cd2dca9c27ef7067a5 (diff) | |
download | bitcoin-80315c011863d69e7785673283e4c9033fbcd5ac.tar.xz |
refactor: Move early loadtxoutset checks into ActiveSnapshot
Also changes the return type of ActiveSnapshot to allow returning the
error message to the user of the loadtxoutset RPC.
Diffstat (limited to 'src/validation.cpp')
-rw-r--r-- | src/validation.cpp | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/validation.cpp b/src/validation.cpp index c34d60f137..53db1cb5b1 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -5647,23 +5647,38 @@ Chainstate& ChainstateManager::InitializeChainstate(CTxMemPool* mempool) return destroyed && !fs::exists(db_path); } -bool ChainstateManager::ActivateSnapshot( +util::Result<void> ChainstateManager::ActivateSnapshot( AutoFile& coins_file, const SnapshotMetadata& metadata, bool in_memory) { uint256 base_blockhash = metadata.m_base_blockhash; + int base_blockheight = metadata.m_base_blockheight; if (this->SnapshotBlockhash()) { - LogPrintf("[snapshot] can't activate a snapshot-based chainstate more than once\n"); - return false; + return util::Error{_("Can't activate a snapshot-based chainstate more than once")}; } { LOCK(::cs_main); + + if (!GetParams().AssumeutxoForBlockhash(base_blockhash).has_value()) { + auto available_heights = GetParams().GetAvailableSnapshotHeights(); + std::string heights_formatted = util::Join(available_heights, ", ", [&](const auto& i) { return util::ToString(i); }); + return util::Error{strprintf(_("assumeutxo block hash in snapshot metadata not recognized (hash: %s, height: %s). The following snapshot heights are available: %s."), + base_blockhash.ToString(), + base_blockheight, + heights_formatted)}; + } + + CBlockIndex* snapshot_start_block = m_blockman.LookupBlockIndex(base_blockhash); + if (!snapshot_start_block) { + return util::Error{strprintf(_("The base block header (%s) must appear in the headers chain. Make sure all headers are syncing, and call loadtxoutset again."), + base_blockhash.ToString())}; + } + if (Assert(m_active_chainstate->GetMempool())->size() > 0) { - LogPrintf("[snapshot] can't activate a snapshot when mempool not empty\n"); - return false; + return util::Error{_("Can't activate a snapshot when mempool not empty.")}; } } @@ -5713,7 +5728,6 @@ bool ChainstateManager::ActivateSnapshot( } auto cleanup_bad_snapshot = [&](const char* reason) EXCLUSIVE_LOCKS_REQUIRED(::cs_main) { - LogPrintf("[snapshot] activation failed - %s\n", reason); this->MaybeRebalanceCaches(); // PopulateAndValidateSnapshot can return (in error) before the leveldb datadir @@ -5729,7 +5743,7 @@ bool ChainstateManager::ActivateSnapshot( "Manually remove it before restarting.\n"), fs::PathToString(*snapshot_datadir))); } } - return false; + return util::Error{_(reason)}; }; if (!this->PopulateAndValidateSnapshot(*snapshot_chainstate, coins_file, metadata)) { @@ -5772,7 +5786,7 @@ bool ChainstateManager::ActivateSnapshot( m_snapshot_chainstate->CoinsTip().DynamicMemoryUsage() / (1000 * 1000)); this->MaybeRebalanceCaches(); - return true; + return {}; } static void FlushSnapshotToDisk(CCoinsViewCache& coins_cache, bool snapshot_loaded) |