mirror of
https://github.com/dashpay/dash.git
synced 2024-12-28 05:23:01 +01:00
Limit setAskFor and retire requested entries only when a getdata returns.
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.
This commit is contained in:
parent
5029698186
commit
ebb25f4c23
@ -4406,6 +4406,7 @@ bool static ProcessMessage(CNode* pfrom, string strCommand, CDataStream& vRecv,
|
|||||||
bool fMissingInputs = false;
|
bool fMissingInputs = false;
|
||||||
CValidationState state;
|
CValidationState state;
|
||||||
|
|
||||||
|
pfrom->setAskFor.erase(inv.hash);
|
||||||
mapAlreadyAskedFor.erase(inv);
|
mapAlreadyAskedFor.erase(inv);
|
||||||
|
|
||||||
// Check for recently rejected (and do other quick existence checks)
|
// Check for recently rejected (and do other quick existence checks)
|
||||||
@ -5225,8 +5226,10 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
|
|||||||
pto->PushMessage("getdata", vGetData);
|
pto->PushMessage("getdata", vGetData);
|
||||||
vGetData.clear();
|
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());
|
pto->mapAskFor.erase(pto->mapAskFor.begin());
|
||||||
}
|
}
|
||||||
if (!vGetData.empty())
|
if (!vGetData.empty())
|
||||||
|
@ -2408,9 +2408,9 @@ CNode::~CNode()
|
|||||||
|
|
||||||
void CNode::AskFor(const CInv& inv)
|
void CNode::AskFor(const CInv& inv)
|
||||||
{
|
{
|
||||||
if (mapAskFor.size() > MAPASKFOR_MAX_SZ)
|
if (mapAskFor.size() > MAPASKFOR_MAX_SZ || setAskFor.size() > SETASKFOR_MAX_SZ)
|
||||||
return;
|
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)
|
if (!setAskFor.insert(inv.hash).second)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@ -58,6 +58,8 @@ static const bool DEFAULT_UPNP = false;
|
|||||||
#endif
|
#endif
|
||||||
/** The maximum number of entries in mapAskFor */
|
/** The maximum number of entries in mapAskFor */
|
||||||
static const size_t MAPASKFOR_MAX_SZ = MAX_INV_SZ;
|
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;
|
||||||
/** The maximum number of peer connections to maintain. */
|
/** The maximum number of peer connections to maintain. */
|
||||||
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
|
static const unsigned int DEFAULT_MAX_PEER_CONNECTIONS = 125;
|
||||||
/** The default for -maxuploadtarget. 0 = Unlimited */
|
/** The default for -maxuploadtarget. 0 = Unlimited */
|
||||||
|
Loading…
Reference in New Issue
Block a user