Limit response to getblocks to half of output buffer size
Introduce SendBufferSize() and ReceiveBufferSize(), and limit the blocks sent as response to the "getblocks" message to half of the active send buffer size.
This commit is contained in:
10
src/main.cpp
10
src/main.cpp
@@ -2040,20 +2040,24 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv)
|
||||
if (pindex)
|
||||
pindex = pindex->pnext;
|
||||
int nLimit = 500 + locator.GetDistanceBack();
|
||||
unsigned int nBytes = 0;
|
||||
printf("getblocks %d to %s limit %d\n", (pindex ? pindex->nHeight : -1), hashStop.ToString().substr(0,20).c_str(), nLimit);
|
||||
for (; pindex; pindex = pindex->pnext)
|
||||
{
|
||||
if (pindex->GetBlockHash() == hashStop)
|
||||
{
|
||||
printf(" getblocks stopping at %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,20).c_str());
|
||||
printf(" getblocks stopping at %d %s (%u bytes)\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,20).c_str(), nBytes);
|
||||
break;
|
||||
}
|
||||
pfrom->PushInventory(CInv(MSG_BLOCK, pindex->GetBlockHash()));
|
||||
if (--nLimit <= 0)
|
||||
CBlock block;
|
||||
block.ReadFromDisk(pindex, true);
|
||||
nBytes += block.GetSerializeSize(SER_NETWORK);
|
||||
if (--nLimit <= 0 || nBytes >= SendBufferSize()/2)
|
||||
{
|
||||
// When this block is requested, we'll send an inv that'll make them
|
||||
// getblocks the next batch of inventory.
|
||||
printf(" getblocks stopping at limit %d %s\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,20).c_str());
|
||||
printf(" getblocks stopping at limit %d %s (%u bytes)\n", pindex->nHeight, pindex->GetBlockHash().ToString().substr(0,20).c_str(), nBytes);
|
||||
pfrom->hashContinue = pindex->GetBlockHash();
|
||||
break;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user