merge bitcoin#23738: improve logging of ChainstateManager snapshot persistance

This commit is contained in:
Kittywhiskers Van Gogh 2021-12-10 17:12:27 +01:00
parent 87257347c2
commit d60f15ec33
No known key found for this signature in database
GPG Key ID: 30CD0C065E5C4AAD

View File

@ -5276,6 +5276,17 @@ bool ChainstateManager::ActivateSnapshot(
return true;
}
static void FlushSnapshotToDisk(CCoinsViewCache& coins_cache, bool snapshot_loaded)
{
LOG_TIME_MILLIS_WITH_CATEGORY_MSG_ONCE(
strprintf("%s (%.2f MB)",
snapshot_loaded ? "saving snapshot chainstate" : "flushing coins cache",
coins_cache.DynamicMemoryUsage() / (1000 * 1000)),
BCLog::LogFlags::ALL);
coins_cache.Flush();
}
bool ChainstateManager::PopulateAndValidateSnapshot(
CChainState& snapshot_chainstate,
CAutoFile& coins_file,
@ -5313,7 +5324,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) {
@ -5357,19 +5367,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);
}
}
}
@ -5399,9 +5404,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);