Browse Source

Call ActivateBestChain without cs_main/with most_recent_block

There is still a call to ActivateBestChain with cs_main if a peer
requests the block prior to it being validated, but this one is
more specifically-gated, so should be less of an issue.
0.14
Matt Corallo 8 years ago
parent
commit
962f7f054f
  1. 18
      src/net_processing.cpp

18
src/net_processing.cpp

@ -964,8 +964,13 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// before ActivateBestChain but after AcceptBlock). // before ActivateBestChain but after AcceptBlock).
// In this case, we need to run ActivateBestChain prior to checking the relay // In this case, we need to run ActivateBestChain prior to checking the relay
// conditions below. // conditions below.
std::shared_ptr<const CBlock> a_recent_block;
{
LOCK(cs_most_recent_block);
a_recent_block = most_recent_block;
}
CValidationState dummy; CValidationState dummy;
ActivateBestChain(dummy, Params()); ActivateBestChain(dummy, Params(), a_recent_block);
} }
if (chainActive.Contains(mi->second)) { if (chainActive.Contains(mi->second)) {
send = true; send = true;
@ -1525,8 +1530,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
uint256 hashStop; uint256 hashStop;
vRecv >> locator >> hashStop; vRecv >> locator >> hashStop;
LOCK(cs_main);
// We might have announced the currently-being-connected tip using a // We might have announced the currently-being-connected tip using a
// compact block, which resulted in the peer sending a getblocks // compact block, which resulted in the peer sending a getblocks
// request, which we would otherwise respond to without the new block. // request, which we would otherwise respond to without the new block.
@ -1535,10 +1538,17 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
// for getheaders requests, and there are no known nodes which support // for getheaders requests, and there are no known nodes which support
// compact blocks but still use getblocks to request blocks. // compact blocks but still use getblocks to request blocks.
{ {
std::shared_ptr<const CBlock> a_recent_block;
{
LOCK(cs_most_recent_block);
a_recent_block = most_recent_block;
}
CValidationState dummy; CValidationState dummy;
ActivateBestChain(dummy, Params()); ActivateBestChain(dummy, Params(), a_recent_block);
} }
LOCK(cs_main);
// Find the last block the caller has in the main chain // Find the last block the caller has in the main chain
const CBlockIndex* pindex = FindForkInGlobalIndex(chainActive, locator); const CBlockIndex* pindex = FindForkInGlobalIndex(chainActive, locator);

Loading…
Cancel
Save