message: validation, log: extract FlushSnapshotToDisk() function
  This moves the flushing and logging into one method and adds logging
  of time duration and memory for the snapshot chainstate flushing.
diff: @@ -4779,6 +4779,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,
  @@ -4816,7 +4830,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) {
  @@ -4860,19 +4873,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);
  }
  }
  }
  @@ -4902,9 +4910,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);
  