mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-10-11 03:53:22 +02:00
Add CChainState::ResizeCoinsCaches
Also adds CCoinsViewCache::ReallocateCache() to attempt to free memory that the cacheCoins's allocator may be hanging onto when downsizing the cache. Adds `CChainState::m_coins{tip,db}_cache_size_bytes` data members so that we can reference cache size on a per-chainstate basis for flushing.
This commit is contained in:
committed by
James O'Beirne
parent
b223111da2
commit
f36aaa6392
@@ -135,7 +135,6 @@ bool fPruneMode = false;
|
||||
bool fRequireStandard = true;
|
||||
bool fCheckBlockIndex = false;
|
||||
bool fCheckpointsEnabled = DEFAULT_CHECKPOINTS_ENABLED;
|
||||
size_t nCoinCacheUsage = 5000 * 300;
|
||||
uint64_t nPruneTarget = 0;
|
||||
int64_t nMaxTipAge = DEFAULT_MAX_TIP_AGE;
|
||||
|
||||
@@ -1279,9 +1278,10 @@ void CChainState::InitCoinsDB(
|
||||
leveldb_name, cache_size_bytes, in_memory, should_wipe);
|
||||
}
|
||||
|
||||
void CChainState::InitCoinsCache()
|
||||
void CChainState::InitCoinsCache(size_t cache_size_bytes)
|
||||
{
|
||||
assert(m_coins_views != nullptr);
|
||||
m_coinstip_cache_size_bytes = cache_size_bytes;
|
||||
m_coins_views->InitCache();
|
||||
}
|
||||
|
||||
@@ -2228,7 +2228,7 @@ CoinsCacheSizeState CChainState::GetCoinsCacheSizeState(const CTxMemPool& tx_poo
|
||||
{
|
||||
return this->GetCoinsCacheSizeState(
|
||||
tx_pool,
|
||||
nCoinCacheUsage,
|
||||
m_coinstip_cache_size_bytes,
|
||||
gArgs.GetArg("-maxmempool", DEFAULT_MAX_MEMPOOL_SIZE) * 1000000);
|
||||
}
|
||||
|
||||
@@ -4300,7 +4300,7 @@ bool CVerifyDB::VerifyDB(const CChainParams& chainparams, CCoinsView *coinsview,
|
||||
}
|
||||
}
|
||||
// check level 3: check for inconsistencies during memory-only disconnect of tip blocks
|
||||
if (nCheckLevel >= 3 && (coins.DynamicMemoryUsage() + ::ChainstateActive().CoinsTip().DynamicMemoryUsage()) <= nCoinCacheUsage) {
|
||||
if (nCheckLevel >= 3 && (coins.DynamicMemoryUsage() + ::ChainstateActive().CoinsTip().DynamicMemoryUsage()) <= ::ChainstateActive().m_coinstip_cache_size_bytes) {
|
||||
assert(coins.GetBestBlock() == pindex->GetBlockHash());
|
||||
DisconnectResult res = ::ChainstateActive().DisconnectBlock(block, pindex, coins);
|
||||
if (res == DISCONNECT_FAILED) {
|
||||
@@ -4965,6 +4965,39 @@ std::string CChainState::ToString()
|
||||
tip ? tip->nHeight : -1, tip ? tip->GetBlockHash().ToString() : "null");
|
||||
}
|
||||
|
||||
bool CChainState::ResizeCoinsCaches(size_t coinstip_size, size_t coinsdb_size)
|
||||
{
|
||||
if (coinstip_size == m_coinstip_cache_size_bytes &&
|
||||
coinsdb_size == m_coinsdb_cache_size_bytes) {
|
||||
// Cache sizes are unchanged, no need to continue.
|
||||
return true;
|
||||
}
|
||||
size_t old_coinstip_size = m_coinstip_cache_size_bytes;
|
||||
m_coinstip_cache_size_bytes = coinstip_size;
|
||||
m_coinsdb_cache_size_bytes = coinsdb_size;
|
||||
CoinsDB().ResizeCache(coinsdb_size);
|
||||
|
||||
LogPrintf("[%s] resized coinsdb cache to %.1f MiB\n",
|
||||
this->ToString(), coinsdb_size * (1.0 / 1024 / 1024));
|
||||
LogPrintf("[%s] resized coinstip cache to %.1f MiB\n",
|
||||
this->ToString(), coinstip_size * (1.0 / 1024 / 1024));
|
||||
|
||||
BlockValidationState state;
|
||||
const CChainParams& chainparams = Params();
|
||||
|
||||
bool ret;
|
||||
|
||||
if (coinstip_size > old_coinstip_size) {
|
||||
// Likely no need to flush if cache sizes have grown.
|
||||
ret = FlushStateToDisk(chainparams, state, FlushStateMode::IF_NEEDED);
|
||||
} else {
|
||||
// Otherwise, flush state to disk and deallocate the in-memory coins map.
|
||||
ret = FlushStateToDisk(chainparams, state, FlushStateMode::ALWAYS);
|
||||
CoinsTip().ReallocateCache();
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
std::string CBlockFileInfo::ToString() const
|
||||
{
|
||||
return strprintf("CBlockFileInfo(blocks=%u, size=%u, heights=%u...%u, time=%s...%s)", nBlocks, nSize, nHeightFirst, nHeightLast, FormatISO8601Date(nTimeFirst), FormatISO8601Date(nTimeLast));
|
||||
|
Reference in New Issue
Block a user