changeset 122:ed91d6637cdb draft

filter out duplicate getblocks and don't relay inv messages during initial block download -- 0.2 rc2
author s_nakamoto <s_nakamoto@1a98c847-1fd6-4fd8-948a-caf3550aa51b>
date Mon, 14 Dec 2009 02:12:01 +0000
parents 7aeb4c7230fd
children d059086f641f
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);
--- a/serialize.h
+++ b/serialize.h
@@ -20,7 +20,7 @@
 class CAutoFile;
 
 static const int VERSION = 200;
-static const char* pszSubVer = " rc1";
+static const char* pszSubVer = " rc2";
 
 
 
--- a/setup.nsi
+++ b/setup.nsi
@@ -42,7 +42,7 @@
 !insertmacro MUI_LANGUAGE English
 
 # Installer attributes
-OutFile bitcoin-0.2.0-setup.exe
+OutFile bitcoin-0.2.0-win32-setup.exe
 InstallDir $PROGRAMFILES\Bitcoin
 CRCCheck on
 XPStyle on