@ -1917,6 +1917,7 @@ bool ConnectBlock(const CBlock& block, CValidationState& state, CBlockIndex* pin
* or always and in all cases if we ' re in prune mode and are deleting files .
* or always and in all cases if we ' re in prune mode and are deleting files .
*/
*/
bool static FlushStateToDisk ( CValidationState & state , FlushStateMode mode ) {
bool static FlushStateToDisk ( CValidationState & state , FlushStateMode mode ) {
int64_t nMempoolUsage = mempool . DynamicMemoryUsage ( ) ;
const CChainParams & chainparams = Params ( ) ;
const CChainParams & chainparams = Params ( ) ;
LOCK2 ( cs_main , cs_LastBlockFile ) ;
LOCK2 ( cs_main , cs_LastBlockFile ) ;
static int64_t nLastWrite = 0 ;
static int64_t nLastWrite = 0 ;
@ -1947,11 +1948,13 @@ bool static FlushStateToDisk(CValidationState &state, FlushStateMode mode) {
if ( nLastSetChain = = 0 ) {
if ( nLastSetChain = = 0 ) {
nLastSetChain = nNow ;
nLastSetChain = nNow ;
}
}
size_t cacheSize = pcoinsTip - > DynamicMemoryUsage ( ) ;
int64_t nMempoolSizeMax = GetArg ( " -maxmempool " , DEFAULT_MAX_MEMPOOL_SIZE ) * 1000000 ;
// The cache is large and close to the limit, but we have time now (not in the middle of a block processing).
int64_t cacheSize = pcoinsTip - > DynamicMemoryUsage ( ) ;
bool fCacheLarge = mode = = FLUSH_STATE_PERIODIC & & cacheSize * ( 10.0 / 9 ) > nCoinCacheUsage ;
int64_t nTotalSpace = nCoinCacheUsage + std : : max < int64_t > ( nMempoolSizeMax - nMempoolUsage , 0 ) ;
// The cache is large and we're within 10% and 100 MiB of the limit, but we have time now (not in the middle of a block processing).
bool fCacheLarge = mode = = FLUSH_STATE_PERIODIC & & cacheSize > std : : max ( ( 9 * nTotalSpace ) / 10 , nTotalSpace - 100 * 1024 * 1024 ) ;
// The cache is over the limit, we have to write now.
// The cache is over the limit, we have to write now.
bool fCacheCritical = mode = = FLUSH_STATE_IF_NEEDED & & cacheSize > nCoinCacheUsage ;
bool fCacheCritical = mode = = FLUSH_STATE_IF_NEEDED & & cacheSize > nTotalSpac e ;
// It's been a while since we wrote the block index to disk. Do this frequently, so we don't need to redownload after a crash.
// It's been a while since we wrote the block index to disk. Do this frequently, so we don't need to redownload after a crash.
bool fPeriodicWrite = mode = = FLUSH_STATE_PERIODIC & & nNow > nLastWrite + ( int64_t ) DATABASE_WRITE_INTERVAL * 1000000 ;
bool fPeriodicWrite = mode = = FLUSH_STATE_PERIODIC & & nNow > nLastWrite + ( int64_t ) DATABASE_WRITE_INTERVAL * 1000000 ;
// It's been very long since we flushed the cache. Do this infrequently, to optimize cache usage.
// It's been very long since we flushed the cache. Do this infrequently, to optimize cache usage.