mirror of
https://github.com/dashpay/dash.git
synced 2024-12-26 20:42:59 +01:00
Avoid cs_main in net_processing ActivateBestChain calls
This commit is contained in:
parent
f69c4370d0
commit
2eb5531747
@ -1060,8 +1060,6 @@ static void RelayAddress(const CAddress& addr, bool fReachable, CConnman& connma
|
|||||||
|
|
||||||
void static ProcessGetBlockData(CNode* pfrom, const Consensus::Params& consensusParams, const CInv& inv, CConnman& connman, const std::atomic<bool>& interruptMsgProc)
|
void static ProcessGetBlockData(CNode* pfrom, const Consensus::Params& consensusParams, const CInv& inv, CConnman& connman, const std::atomic<bool>& interruptMsgProc)
|
||||||
{
|
{
|
||||||
LOCK(cs_main);
|
|
||||||
|
|
||||||
bool send = false;
|
bool send = false;
|
||||||
std::shared_ptr<const CBlock> a_recent_block;
|
std::shared_ptr<const CBlock> a_recent_block;
|
||||||
std::shared_ptr<const CBlockHeaderAndShortTxIDs> a_recent_compact_block;
|
std::shared_ptr<const CBlockHeaderAndShortTxIDs> a_recent_compact_block;
|
||||||
@ -1071,7 +1069,9 @@ void static ProcessGetBlockData(CNode* pfrom, const Consensus::Params& consensus
|
|||||||
a_recent_compact_block = most_recent_compact_block;
|
a_recent_compact_block = most_recent_compact_block;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool need_activate_chain = false;
|
||||||
{
|
{
|
||||||
|
LOCK(cs_main);
|
||||||
BlockMap::iterator mi = mapBlockIndex.find(inv.hash);
|
BlockMap::iterator mi = mapBlockIndex.find(inv.hash);
|
||||||
if (mi != mapBlockIndex.end())
|
if (mi != mapBlockIndex.end())
|
||||||
{
|
{
|
||||||
@ -1082,11 +1082,16 @@ void static ProcessGetBlockData(CNode* pfrom, const Consensus::Params& consensus
|
|||||||
// 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.
|
||||||
CValidationState dummy;
|
need_activate_chain = true;
|
||||||
ActivateBestChain(dummy, Params(), a_recent_block);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} // release cs_main before calling ActivateBestChain
|
||||||
|
if (need_activate_chain) {
|
||||||
|
CValidationState dummy;
|
||||||
|
ActivateBestChain(dummy, Params(), a_recent_block);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOCK(cs_main);
|
||||||
BlockMap::iterator mi = mapBlockIndex.find(inv.hash);
|
BlockMap::iterator mi = mapBlockIndex.find(inv.hash);
|
||||||
if (mi != mapBlockIndex.end()) {
|
if (mi != mapBlockIndex.end()) {
|
||||||
send = BlockRequestAllowed(mi->second, consensusParams);
|
send = BlockRequestAllowed(mi->second, consensusParams);
|
||||||
@ -1181,6 +1186,8 @@ void static ProcessGetBlockData(CNode* pfrom, const Consensus::Params& consensus
|
|||||||
|
|
||||||
void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParams, CConnman& connman, const std::atomic<bool>& interruptMsgProc)
|
void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParams, CConnman& connman, const std::atomic<bool>& interruptMsgProc)
|
||||||
{
|
{
|
||||||
|
AssertLockNotHeld(cs_main);
|
||||||
|
|
||||||
std::deque<CInv>::iterator it = pfrom->vRecvGetData.begin();
|
std::deque<CInv>::iterator it = pfrom->vRecvGetData.begin();
|
||||||
std::vector<CInv> vNotFound;
|
std::vector<CInv> vNotFound;
|
||||||
const CNetMsgMaker msgMaker(pfrom->GetSendVersion());
|
const CNetMsgMaker msgMaker(pfrom->GetSendVersion());
|
||||||
@ -1362,16 +1369,16 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
|
|||||||
// Track requests for our stuff.
|
// Track requests for our stuff.
|
||||||
GetMainSignals().Inventory(inv.hash);
|
GetMainSignals().Inventory(inv.hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (it != pfrom->vRecvGetData.end()) {
|
|
||||||
const CInv &inv = *it;
|
|
||||||
it++;
|
|
||||||
if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK || inv.type == MSG_CMPCT_BLOCK) {
|
|
||||||
ProcessGetBlockData(pfrom, consensusParams, inv, connman, interruptMsgProc);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // release cs_main
|
} // release cs_main
|
||||||
|
|
||||||
|
if (it != pfrom->vRecvGetData.end()) {
|
||||||
|
const CInv &inv = *it;
|
||||||
|
it++;
|
||||||
|
if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK || inv.type == MSG_CMPCT_BLOCK) {
|
||||||
|
ProcessGetBlockData(pfrom, consensusParams, inv, connman, interruptMsgProc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pfrom->vRecvGetData.erase(pfrom->vRecvGetData.begin(), it);
|
pfrom->vRecvGetData.erase(pfrom->vRecvGetData.begin(), it);
|
||||||
|
|
||||||
if (!vNotFound.empty()) {
|
if (!vNotFound.empty()) {
|
||||||
@ -1977,7 +1984,7 @@ bool static ProcessMessage(CNode* pfrom, const std::string& strCommand, CDataStr
|
|||||||
inv.type = MSG_BLOCK;
|
inv.type = MSG_BLOCK;
|
||||||
inv.hash = req.blockhash;
|
inv.hash = req.blockhash;
|
||||||
pfrom->vRecvGetData.push_back(inv);
|
pfrom->vRecvGetData.push_back(inv);
|
||||||
ProcessGetData(pfrom, chainparams.GetConsensus(), connman, interruptMsgProc);
|
// The message processing loop will go around again (without pausing) and we'll respond then (without cs_main)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user