Skip to content

Commit

Permalink
Limit setAskFor and retire requested entries only when a getdata retu…
Browse files Browse the repository at this point in the history
…rns.

The setAskFor duplicate elimination was too eager and removed entries
 when we still had no getdata response, allowing the peer to keep
 INVing and not responding.
  • Loading branch information
gmaxwell authored and bitcartel committed Sep 16, 2016
1 parent 56f165b commit e2190f8
Show file tree
Hide file tree
Showing 3 changed files with 8 additions and 3 deletions.
5 changes: 4 additions & 1 deletion 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,8 +5452,10 @@ 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->setAskFor.erase(inv.hash);
pto->mapAskFor.erase(pto->mapAskFor.begin());
}
if (!vGetData.empty())
Expand Down
4 changes: 2 additions & 2 deletions src/net.cpp
Expand Up @@ -2178,9 +2178,9 @@ 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 occupy multiple positions in an inv's request queue
// a peer may not have multiple non-responded queue positions for a single inv item
if (!setAskFor.insert(inv.hash).second)
return;

Expand Down
2 changes: 2 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

0 comments on commit e2190f8

Please sign in to comment.