Avoid holding cs_most_recent_block while calling ReadBlockFromDisk

This commit is contained in:
Matt Corallo 2017-01-05 15:15:40 -05:00
parent 9eb67f5000
commit c1ae4fcf7d

View file

@ -2894,15 +2894,20 @@ bool SendMessages(CNode* pto, CConnman& connman, std::atomic<bool>& interruptMsg
int nSendFlags = state.fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS; int nSendFlags = state.fWantsCmpctWitness ? 0 : SERIALIZE_TRANSACTION_NO_WITNESS;
LOCK(cs_most_recent_block); bool fGotBlockFromCache = false;
if (most_recent_block_hash == pBestIndex->GetBlockHash()) { {
if (state.fWantsCmpctWitness) LOCK(cs_most_recent_block);
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *most_recent_compact_block)); if (most_recent_block_hash == pBestIndex->GetBlockHash()) {
else { if (state.fWantsCmpctWitness)
CBlockHeaderAndShortTxIDs cmpctblock(*most_recent_block, state.fWantsCmpctWitness); connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, *most_recent_compact_block));
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock)); else {
CBlockHeaderAndShortTxIDs cmpctblock(*most_recent_block, state.fWantsCmpctWitness);
connman.PushMessage(pto, msgMaker.Make(nSendFlags, NetMsgType::CMPCTBLOCK, cmpctblock));
}
fGotBlockFromCache = true;
} }
} else { }
if (!fGotBlockFromCache) {
CBlock block; CBlock block;
bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams); bool ret = ReadBlockFromDisk(block, pBestIndex, consensusParams);
assert(ret); assert(ret);