Mercurial > hg > bitcoin
changeset 37:1c6bbc868609 draft
filter out duplicate getblocks and don't relay inv messages during initial block download -- 0.2 rc2
git-svn-id: https://bitcoin.svn.sourceforge.net/svnroot/bitcoin/trunk@49 1a98c847-1fd6-4fd8-948a-caf3550aa51b
author | s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b> |
---|---|
date | Mon, 14 Dec 2009 02:12:01 +0000 |
parents | c1691e07077d |
children | d36e511e195f |
files | main.cpp net.cpp net.h serialize.h setup.nsi |
diffstat | 5 files changed, 38 insertions(+), 19 deletions(-) [+] |
line wrap: on
line diff
--- a/main.cpp +++ b/main.cpp @@ -1274,7 +1274,7 @@ if (!AddToBlockIndex(nFile, nBlockPos)) return error("AcceptBlock() : AddToBlockIndex failed"); - if (hashBestChain == hash) + if (hashBestChain == hash && nBestHeight > 28000) RelayInventory(CInv(MSG_BLOCK, hash)); // // Add atoms to user reviews for coins created @@ -1314,7 +1314,7 @@ // Ask this guy to fill in what we're missing if (pfrom) - pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), GetOrphanRoot(pblock)); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(pblock)); return true; } @@ -1816,7 +1816,7 @@ if (!fAskedForBlocks && !pfrom->fClient) { fAskedForBlocks = true; - pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), uint256(0)); + pfrom->PushGetBlocks(pindexBest, uint256(0)); } pfrom->fSuccessfullyConnected = true; @@ -1836,6 +1836,8 @@ { vector<CAddress> vAddr; vRecv >> vAddr; + if (vAddr.size() > 50000) // lower this to 1000 later + return error("message addr size() = %d", vAddr.size()); // Store the new addresses CAddrDB addrdb; @@ -1864,6 +1866,8 @@ { vector<CInv> vInv; vRecv >> vInv; + if (vInv.size() > 50000) + return error("message inv size() = %d", vInv.size()); CTxDB txdb("r"); foreach(const CInv& inv, vInv) @@ -1878,7 +1882,7 @@ if (!fAlreadyHave) pfrom->AskFor(inv); else if (inv.type == MSG_BLOCK && mapOrphanBlocks.count(inv.hash)) - pfrom->PushMessage("getblocks", CBlockLocator(pindexBest), GetOrphanRoot(mapOrphanBlocks[inv.hash])); + pfrom->PushGetBlocks(pindexBest, GetOrphanRoot(mapOrphanBlocks[inv.hash])); // Track requests for our stuff CRITICAL_BLOCK(cs_mapRequestCount) @@ -1895,6 +1899,8 @@ { vector<CInv> vInv; vRecv >> vInv; + if (vInv.size() > 50000) + return error("message getdata size() = %d", vInv.size()); foreach(const CInv& inv, vInv) { @@ -2210,17 +2216,6 @@ } } - // Clear inventory known periodically in case an inv message was missed, - // although usually they would just get it from another node. - static int64 nLastInventoryKnownClear; - if (GetTime() - nLastInventoryKnownClear > 2 * 60 * 60) // every 2 hours - { - nLastInventoryKnownClear = GetTime(); - CRITICAL_BLOCK(cs_vNodes) - foreach(CNode* pnode, vNodes) - pnode->setInventoryKnown.clear(); - } - // // Message: addr
--- a/net.cpp +++ b/net.cpp @@ -40,6 +40,23 @@ + + +void CNode::PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd) +{ + // Filter out duplicate requests + if (pindexBegin == pindexLastGetBlocksBegin && hashEnd == hashLastGetBlocksEnd) + return; + pindexLastGetBlocksBegin = pindexBegin; + hashLastGetBlocksEnd = hashEnd; + + PushMessage("getblocks", CBlockLocator(pindexBegin), hashEnd); +} + + + + + bool ConnectSocket(const CAddress& addrConnect, SOCKET& hSocketRet) { hSocketRet = INVALID_SOCKET; @@ -764,12 +781,12 @@ printf("socket no message in first 60 seconds, %d %d\n", pnode->nLastRecv != 0, pnode->nLastSend != 0); pnode->fDisconnect = true; } - else if (GetTime() - pnode->nLastSend > 10 * 60 && GetTime() - pnode->nLastSendEmpty > 10 * 60) + else if (GetTime() - pnode->nLastSend > 90*60 && GetTime() - pnode->nLastSendEmpty > 90*60) { printf("socket not sending\n"); pnode->fDisconnect = true; } - else if (GetTime() - pnode->nLastRecv > (pnode->nVersion >= 107 ? 15*60 : 90*60)) + else if (GetTime() - pnode->nLastRecv > 90*60) { printf("socket inactivity timeout\n"); pnode->fDisconnect = true;
--- a/net.h +++ b/net.h @@ -7,6 +7,7 @@ class CInv; class CRequestTracker; class CNode; +class CBlockIndex; @@ -504,6 +505,8 @@ map<uint256, CRequestTracker> mapRequests; CCriticalSection cs_mapRequests; uint256 hashContinue; + CBlockIndex* pindexLastGetBlocksBegin; + uint256 hashLastGetBlocksEnd; // flood vector<CAddress> vAddrToSend; @@ -541,6 +544,8 @@ nRefCount = 0; nReleaseTime = 0; hashContinue = 0; + pindexLastGetBlocksBegin = 0; + hashLastGetBlocksEnd = 0; fGetAddr = false; vfSubscribe.assign(256, false); @@ -635,6 +640,7 @@ } + void BeginMessage(const char* pszCommand) { cs_vSend.Enter(); @@ -900,6 +906,7 @@ + void PushGetBlocks(CBlockIndex* pindexBegin, uint256 hashEnd); bool IsSubscribed(unsigned int nChannel); void Subscribe(unsigned int nChannel, unsigned int nHops=0); void CancelSubscribe(unsigned int nChannel);