Reduce cs_main lock in ReadBlockFromDisk, only read GetBlockPos under the lock

This commit is contained in:
Jonas Schnelli 2017-12-13 11:06:51 -10:00
parent bc356b4268
commit ccd8ef65f9
No known key found for this signature in database
GPG Key ID: 1EB776BB03C7922D
2 changed files with 8 additions and 7 deletions

View File

@ -1121,7 +1121,13 @@ bool ReadBlockFromDisk(CBlock& block, const CDiskBlockPos& pos, const Consensus:
bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams) bool ReadBlockFromDisk(CBlock& block, const CBlockIndex* pindex, const Consensus::Params& consensusParams)
{ {
if (!ReadBlockFromDisk(block, pindex->GetBlockPos(), consensusParams)) CDiskBlockPos blockPos;
{
LOCK(cs_main);
blockPos = pindex->GetBlockPos();
}
if (!ReadBlockFromDisk(block, blockPos, consensusParams))
return false; return false;
if (block.GetHash() != pindex->GetBlockHash()) if (block.GetHash() != pindex->GetBlockHash())
return error("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s", return error("ReadBlockFromDisk(CBlock&, CBlockIndex*): GetHash() doesn't match index for %s at %s",

View File

@ -1689,13 +1689,8 @@ CBlockIndex* CWallet::ScanForWalletTransactions(CBlockIndex* pindexStart, CBlock
LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex)); LogPrintf("Still rescanning. At block %d. Progress=%f\n", pindex->nHeight, GuessVerificationProgress(chainParams.TxData(), pindex));
} }
bool readRet = false;
CBlock block; CBlock block;
{ if (ReadBlockFromDisk(block, pindex, Params().GetConsensus())) {
LOCK(cs_main);
readRet = ReadBlockFromDisk(block, pindex, Params().GetConsensus());
}
if (readRet) {
LOCK2(cs_main, cs_wallet); LOCK2(cs_main, cs_wallet);
if (pindex && !chainActive.Contains(pindex)) { if (pindex && !chainActive.Contains(pindex)) {
// Abort scan if current block is no longer active, to prevent // Abort scan if current block is no longer active, to prevent