Skip to content

Commit

Permalink
Merge pull request #2840 from sipa/nosendlock
Browse files Browse the repository at this point in the history
Allow SendMessages to run partially without cs_main
  • Loading branch information
gavinandresen committed Oct 21, 2013
2 parents 34f72ad + 7d38af3 commit 749230d
Show file tree
Hide file tree
Showing 2 changed files with 38 additions and 22 deletions.
57 changes: 36 additions & 21 deletions src/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3234,6 +3234,8 @@ void static ProcessGetData(CNode* pfrom)

vector<CInv> vNotFound;

LOCK(cs_main);

while (it != pfrom->vRecvGetData.end()) {
// Don't bother if send buffer is too full to respond anyway
if (pfrom->nSendSize >= SendBufferSize())
Expand Down Expand Up @@ -3406,7 +3408,6 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)

pfrom->fClient = !(pfrom->nServices & NODE_NETWORK);

AddTimeData(pfrom->addr, nTime);

// Change version
pfrom->PushMessage("verack");
Expand Down Expand Up @@ -3448,6 +3449,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)

LogPrintf("receive version message: version %d, blocks=%d, us=%s, them=%s, peer=%s\n", pfrom->nVersion, pfrom->nStartingHeight, addrMe.ToString().c_str(), addrFrom.ToString().c_str(), pfrom->addr.ToString().c_str());

LOCK(cs_main);
AddTimeData(pfrom->addr, nTime);
cPeerBlockCounts.input(pfrom->nStartingHeight);
}

Expand Down Expand Up @@ -3551,6 +3554,9 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
break;
}
}

LOCK(cs_main);

for (unsigned int nInv = 0; nInv < vInv.size(); nInv++)
{
const CInv &inv = vInv[nInv];
Expand Down Expand Up @@ -3608,6 +3614,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
uint256 hashStop;
vRecv >> locator >> hashStop;

LOCK(cs_main);

// Find the last block the caller has in the main chain
CBlockIndex* pindex = chainActive.FindFork(locator);

Expand Down Expand Up @@ -3642,6 +3650,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
uint256 hashStop;
vRecv >> locator >> hashStop;

LOCK(cs_main);

CBlockIndex* pindex = NULL;
if (locator.IsNull())
{
Expand Down Expand Up @@ -3683,6 +3693,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
CInv inv(MSG_TX, tx.GetHash());
pfrom->AddInventoryKnown(inv);

LOCK(cs_main);

bool fMissingInputs = false;
CValidationState state;
if (mempool.accept(state, tx, true, &fMissingInputs))
Expand Down Expand Up @@ -3757,6 +3769,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
CInv inv(MSG_BLOCK, block.GetHash());
pfrom->AddInventoryKnown(inv);

LOCK(cs_main);

CValidationState state;
if (ProcessBlock(state, pfrom, &block))
mapAlreadyAskedFor.erase(inv);
Expand All @@ -3778,6 +3792,8 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)

else if (strCommand == "mempool")
{
LOCK(cs_main);

std::vector<uint256> vtxid;
LOCK2(mempool.cs, pfrom->cs_filter);
mempool.queryHashes(vtxid);
Expand Down Expand Up @@ -4043,10 +4059,7 @@ bool ProcessMessages(CNode* pfrom)
bool fRet = false;
try
{
{
LOCK(cs_main);
fRet = ProcessMessage(pfrom, strCommand, vRecv);
}
fRet = ProcessMessage(pfrom, strCommand, vRecv);
boost::this_thread::interruption_point();
}
catch (std::ios_base::failure& e)
Expand Down Expand Up @@ -4089,8 +4102,7 @@ bool ProcessMessages(CNode* pfrom)

bool SendMessages(CNode* pto, bool fSendTrickle)
{
TRY_LOCK(cs_main, lockMain);
if (lockMain) {
{
// Don't send anything until we get their version message
if (pto->nVersion == 0)
return true;
Expand Down Expand Up @@ -4125,20 +4137,6 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
}
}

// Start block sync
if (pto->fStartSync && !fImporting && !fReindex) {
pto->fStartSync = false;
PushGetBlocks(pto, chainActive.Tip(), uint256(0));
}

// Resend wallet transactions that haven't gotten in a block yet
// Except during reindex, importing and IBD, when old wallet
// transactions become unconfirmed and spams other nodes.
if (!fReindex && !fImporting && !IsInitialBlockDownload())
{
ResendWalletTransactions();
}

// Address refresh broadcast
static int64 nLastRebroadcast;
if (!IsInitialBlockDownload() && (GetTime() - nLastRebroadcast > 24 * 60 * 60))
Expand Down Expand Up @@ -4189,6 +4187,23 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
pto->PushMessage("addr", vAddr);
}

TRY_LOCK(cs_main, lockMain);
if (!lockMain)
return true;

// Start block sync
if (pto->fStartSync && !fImporting && !fReindex) {
pto->fStartSync = false;
PushGetBlocks(pto, chainActive.Tip(), uint256(0));
}

// Resend wallet transactions that haven't gotten in a block yet
// Except during reindex, importing and IBD, when old wallet
// transactions become unconfirmed and spams other nodes.
if (!fReindex && !fImporting && !IsInitialBlockDownload())
{
ResendWalletTransactions();
}

//
// Message: inventory
Expand Down
3 changes: 2 additions & 1 deletion src/net.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -801,7 +801,8 @@ void ThreadSocketHandler()
vNodesDisconnected.push_back(pnode);
}
}

}
{
// Delete disconnected nodes
list<CNode*> vNodesDisconnectedCopy = vNodesDisconnected;
BOOST_FOREACH(CNode* pnode, vNodesDisconnectedCopy)
Expand Down

0 comments on commit 749230d

Please sign in to comment.