aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/validation.cpp29
1 files changed, 18 insertions, 11 deletions
diff --git a/src/validation.cpp b/src/validation.cpp
index d4203de56a..0f65f56ca1 100644
--- a/src/validation.cpp
+++ b/src/validation.cpp
@@ -4840,6 +4840,20 @@ bool ChainstateManager::ActivateSnapshot(
return true;
}
+static void FlushSnapshotToDisk(CCoinsViewCache& coins_cache, bool snapshot_loaded)
+{
+ LogPrintf("[snapshot] flushing %s (%.2f MB)... ", /* Continued */
+ snapshot_loaded ? "snapshot chainstate to disk" : "coins cache",
+ coins_cache.DynamicMemoryUsage() / (1000 * 1000));
+
+ const int64_t flush_now{GetTimeMillis()};
+
+ // TODO: if #17487 is merged, add erase=false here if snapshot is loaded, for better performance.
+ coins_cache.Flush();
+
+ LogPrintf("done (%.2fms)\n", GetTimeMillis() - flush_now);
+}
+
bool ChainstateManager::PopulateAndValidateSnapshot(
CChainState& snapshot_chainstate,
CAutoFile& coins_file,
@@ -4877,7 +4891,6 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
uint64_t coins_left = metadata.m_coins_count;
LogPrintf("[snapshot] loading coins from snapshot %s\n", base_blockhash.ToString());
- int64_t flush_now{0};
int64_t coins_processed{0};
while (coins_left > 0) {
@@ -4921,19 +4934,14 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
const auto snapshot_cache_state = WITH_LOCK(::cs_main,
return snapshot_chainstate.GetCoinsCacheSizeState());
- if (snapshot_cache_state >=
- CoinsCacheSizeState::CRITICAL) {
- LogPrintf("[snapshot] flushing coins cache (%.2f MB)... ", /* Continued */
- coins_cache.DynamicMemoryUsage() / (1000 * 1000));
- flush_now = GetTimeMillis();
-
+ if (snapshot_cache_state >= CoinsCacheSizeState::CRITICAL) {
// This is a hack - we don't know what the actual best block is, but that
// doesn't matter for the purposes of flushing the cache here. We'll set this
// to its correct value (`base_blockhash`) below after the coins are loaded.
coins_cache.SetBestBlock(GetRandHash());
- coins_cache.Flush();
- LogPrintf("done (%.2fms)\n", GetTimeMillis() - flush_now);
+ // No need to acquire cs_main since this chainstate isn't being used yet.
+ FlushSnapshotToDisk(coins_cache, /*snapshot_loaded=*/false);
}
}
}
@@ -4963,9 +4971,8 @@ bool ChainstateManager::PopulateAndValidateSnapshot(
coins_cache.DynamicMemoryUsage() / (1000 * 1000),
base_blockhash.ToString());
- LogPrintf("[snapshot] flushing snapshot chainstate to disk\n");
// No need to acquire cs_main since this chainstate isn't being used yet.
- coins_cache.Flush(); // TODO: if #17487 is merged, add erase=false here for better performance.
+ FlushSnapshotToDisk(coins_cache, /*snapshot_loaded=*/true);
assert(coins_cache.GetBestBlock() == base_blockhash);