aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/main.cpp1
-rw-r--r--src/net.cpp4
-rw-r--r--src/net.h1
3 files changed, 6 insertions, 0 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 2579b642b8..05dedb5631 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -5226,6 +5226,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
vGetData.clear();
}
}
+ pto->setAskFor.erase(inv.hash);
pto->mapAskFor.erase(pto->mapAskFor.begin());
}
if (!vGetData.empty())
diff --git a/src/net.cpp b/src/net.cpp
index cff4c54505..04119e9ddd 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -2410,6 +2410,10 @@ void CNode::AskFor(const CInv& inv)
{
if (mapAskFor.size() > MAPASKFOR_MAX_SZ)
return;
+ // a peer may not occupy multiple positions in an inv's request queue
+ 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;
diff --git a/src/net.h b/src/net.h
index 559cdf0878..046811d54c 100644
--- a/src/net.h
+++ b/src/net.h
@@ -382,6 +382,7 @@ public:
mruset<CInv> setInventoryKnown;
std::vector<CInv> vInventoryToSend;
CCriticalSection cs_inventory;
+ std::set<uint256> setAskFor;
std::multimap<int64_t, CInv> mapAskFor;
// Ping time measurement: