Skip to content

Commit

Permalink
Auto merge of #1407 - bitcartel:master_bitcoin_7079, r=daira
Browse files Browse the repository at this point in the history
Upstream patch: Prevent peer flooding inv request queue

bitcoin/bitcoin#7079
5029698
ebb25f4
  • Loading branch information
zkbot committed Sep 20, 2016
2 parents 65b502a + e2190f8 commit 5ef7fec
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 1 deletion.
4 changes: 4 additions & 0 deletions src/main.cpp
Expand Up @@ -4657,6 +4657,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
bool fMissingInputs = false;
CValidationState state;

pfrom->setAskFor.erase(inv.hash);
mapAlreadyAskedFor.erase(inv);

// Check for recently rejected (and do other quick existence checks)
Expand Down Expand Up @@ -5451,6 +5452,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
pto->PushMessage("getdata", vGetData);
vGetData.clear();
}
} else {
//If we're not going to ask, don't expect a response.
pto->setAskFor.erase(inv.hash);
}
pto->mapAskFor.erase(pto->mapAskFor.begin());
}
Expand Down
6 changes: 5 additions & 1 deletion src/net.cpp
Expand Up @@ -2178,8 +2178,12 @@ CNode::~CNode()

void CNode::AskFor(const CInv& inv)
{
if (mapAskFor.size() > MAPASKFOR_MAX_SZ)
if (mapAskFor.size() > MAPASKFOR_MAX_SZ || setAskFor.size() > SETASKFOR_MAX_SZ)
return;
// a peer may not have multiple non-responded queue positions for a single inv item
if (!setAskFor.insert(inv.hash).second)
return;

// We're using mapAskFor as a priority queue,
// the key is the earliest time the request can be sent
int64_t nRequestTime;
Expand Down
3 changes: 3 additions & 0 deletions src/net.h
Expand Up @@ -59,6 +59,8 @@ static const bool DEFAULT_UPNP = false;
#endif
/** The maximum number of entries in mapAskFor */
static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ;
/** The maximum number of entries in setAskFor (larger due to getdata latency)*/
static const size_t SETASKFOR_MAX_SZ = 2 * MAX_INV_SZ;

unsigned int ReceiveFloodSize();
unsigned int SendBufferSize();
Expand Down Expand Up @@ -310,6 +312,7 @@ class CNode
mruset<CInv> setInventoryKnown;
std::vector<CInv> vInventoryToSend;
CCriticalSection cs_inventory;
std::set<uint256> setAskFor;
std::multimap<int64_t, CInv> mapAskFor;

// Ping time measurement:
Expand Down

0 comments on commit 5ef7fec

Please sign in to comment.