diff --git a/src/validation.cpp b/src/validation.cpp --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4627,13 +4627,13 @@ nCheckLevel); CCoinsViewCache coins(coinsview); - CBlockIndex *pindexState = chainActive.Tip(); + CBlockIndex *pindex; CBlockIndex *pindexFailure = nullptr; int nGoodTransactions = 0; CValidationState state; int reportDone = 0; LogPrintfToBeContinued("[0%%]..."); - for (CBlockIndex *pindex = chainActive.Tip(); pindex && pindex->pprev; + for (pindex = chainActive.Tip(); pindex && pindex->pprev; pindex = pindex->pprev) { boost::this_thread::interruption_point(); int percentageDone = std::max( @@ -4694,7 +4694,7 @@ // check level 3: check for inconsistencies during memory-only // disconnect of tip blocks - if (nCheckLevel >= 3 && pindex == pindexState && + if (nCheckLevel >= 3 && (coins.DynamicMemoryUsage() + pcoinsTip->DynamicMemoryUsage()) <= nCoinCacheUsage) { assert(coins.GetBestBlock() == pindex->GetBlockHash()); @@ -4707,7 +4707,6 @@ pindex->GetBlockHash().ToString()); } - pindexState = pindex->pprev; if (res == DISCONNECT_UNCLEAN) { nGoodTransactions = 0; pindexFailure = pindex; @@ -4728,9 +4727,11 @@ nGoodTransactions); } + // store block count as we move pindex at check level >= 4 + int block_count = chainActive.Height() - pindex->nHeight; + // check level 4: try reconnecting blocks if (nCheckLevel >= 4) { - CBlockIndex *pindex = pindexState; while (pindex != chainActive.Tip()) { boost::this_thread::interruption_point(); uiInterface.ShowProgress( @@ -4760,7 +4761,7 @@ LogPrintf("[DONE].\n"); LogPrintf("No coin database inconsistencies in last %i blocks (%i " "transactions)\n", - chainActive.Height() - pindexState->nHeight, nGoodTransactions); + block_count, nGoodTransactions); return true; }