From 7084756f4f4e34818659a10f62933fcfc77fe27f Mon Sep 17 00:00:00 2001 From: Patrick Strateman Date: Mon, 28 Oct 2013 13:20:21 -0700 Subject: process received messages one at a time without sleeping between messages --- src/main.cpp | 8 ++++++++ src/net.cpp | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main.cpp b/src/main.cpp index ce45133a9f..d4816ca22f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3141,6 +3141,9 @@ void static ProcessGetData(CNode* pfrom) // Track requests for our stuff. Inventory(inv.hash); + + if (inv.type == MSG_BLOCK || inv.type == MSG_FILTERED_BLOCK) + break; } } @@ -3751,6 +3754,9 @@ bool ProcessMessages(CNode* pfrom) if (!pfrom->vRecvGetData.empty()) ProcessGetData(pfrom); + // this maintains the order of responses + if (!pfrom->vRecvGetData.empty()) return fOk; + std::deque::iterator it = pfrom->vRecvMsg.begin(); while (!pfrom->fDisconnect && it != pfrom->vRecvMsg.end()) { // Don't bother if send buffer is too full to respond anyway @@ -3841,6 +3847,8 @@ bool ProcessMessages(CNode* pfrom) if (!fRet) printf("ProcessMessage(%s, %u bytes) FAILED\n", strCommand.c_str(), nMessageSize); + + break; } // In case the connection got shut down, its receive buffer was wiped diff --git a/src/net.cpp b/src/net.cpp index 30215d1bc5..e5f85d3290 100644 --- a/src/net.cpp +++ b/src/net.cpp @@ -1629,6 +1629,9 @@ void ThreadMessageHandler() CNode* pnodeTrickle = NULL; if (!vNodesCopy.empty()) pnodeTrickle = vNodesCopy[GetRand(vNodesCopy.size())]; + + bool fSleep = true; + BOOST_FOREACH(CNode* pnode, vNodesCopy) { if (pnode->fDisconnect) @@ -1638,8 +1641,18 @@ void ThreadMessageHandler() { TRY_LOCK(pnode->cs_vRecvMsg, lockRecv); if (lockRecv) + { if (!ProcessMessages(pnode)) pnode->CloseSocketDisconnect(); + + if (pnode->nSendSize < SendBufferSize()) + { + if (!pnode->vRecvGetData.empty() || (!pnode->vRecvMsg.empty() && pnode->vRecvMsg[0].complete())) + { + fSleep = false; + } + } + } } boost::this_thread::interruption_point(); @@ -1658,7 +1671,8 @@ void ThreadMessageHandler() pnode->Release(); } - MilliSleep(100); + if (fSleep) + MilliSleep(100); } } -- cgit v1.2.3