aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGregory Maxwell <[email protected]>2015-11-26 05:25:30 +0000
committerPieter Wuille <[email protected]>2015-11-30 12:53:48 +0100
commitec73ef37eccfeda76de55c4ff93ea54d4e69e1ec (patch)
treefee5ec5cdc8537bb6bd84d92ab9edd0d7fb1cdd5
parentMerge pull request #7103 (diff)
downloaddiscoin-ec73ef37eccfeda76de55c4ff93ea54d4e69e1ec.tar.xz
discoin-ec73ef37eccfeda76de55c4ff93ea54d4e69e1ec.zip
Replace setInventoryKnown with a rolling bloom filter.
Mruset setInventoryKnown was reduced to a remarkably small 1000 entries as a side effect of sendbuffer size reductions in 2012. This removes setInventoryKnown filtering from merkleBlock responses because false positives there are especially unattractive and also because I'm not sure if there aren't race conditions around the relay pool that would cause some transactions there to be suppressed. (Also, ProcessGetData was accessing setInventoryKnown without taking the required lock.)
-rw-r--r--src/main.cpp9
-rw-r--r--src/net.cpp3
-rw-r--r--src/net.h6
3 files changed, 9 insertions, 9 deletions
diff --git a/src/main.cpp b/src/main.cpp
index 901a34bde..5e39c31bd 100644
--- a/src/main.cpp
+++ b/src/main.cpp
@@ -4138,8 +4138,7 @@ void static ProcessGetData(CNode* pfrom, const Consensus::Params& consensusParam
// however we MUST always provide at least what the remote peer needs
typedef std::pair<unsigned int, uint256> PairType;
BOOST_FOREACH(PairType& pair, merkleBlock.vMatchedTxn)
- if (!pfrom->setInventoryKnown.count(CInv(MSG_TX, pair.second)))
- pfrom->PushMessage("tx", block.vtx[pair.first]);
+ pfrom->PushMessage("tx", block.vtx[pair.first]);
}
// else
// no response
@@ -5511,7 +5510,7 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
vInvWait.reserve(pto->vInventoryToSend.size());
BOOST_FOREACH(const CInv& inv, pto->vInventoryToSend)
{
- if (pto->setInventoryKnown.count(inv))
+ if (pto->setInventoryKnown.contains(inv.hash))
continue;
// trickle out tx inv to protect privacy
@@ -5532,9 +5531,9 @@ bool SendMessages(CNode* pto, bool fSendTrickle)
}
}
- // returns true if wasn't already contained in the set
- if (pto->setInventoryKnown.insert(inv).second)
+ if (!pto->setInventoryKnown.contains(inv.hash))
{
+ pto->setInventoryKnown.insert(inv.hash);
vInv.push_back(inv);
if (vInv.size() >= 1000)
{
diff --git a/src/net.cpp b/src/net.cpp
index abc7cbb8f..fc8fa30ee 100644
--- a/src/net.cpp
+++ b/src/net.cpp
@@ -2342,7 +2342,7 @@ unsigned int SendBufferSize() { return 1000*GetArg("-maxsendbuffer", DEFAULT_MAX
CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNameIn, bool fInboundIn) :
ssSend(SER_NETWORK, INIT_PROTO_VERSION),
addrKnown(5000, 0.001),
- setInventoryKnown(SendBufferSize() / 1000)
+ setInventoryKnown(50000, 0.000001)
{
nServices = 0;
hSocket = hSocketIn;
@@ -2369,6 +2369,7 @@ CNode::CNode(SOCKET hSocketIn, const CAddress& addrIn, const std::string& addrNa
nSendOffset = 0;
hashContinue = uint256();
nStartingHeight = -1;
+ setInventoryKnown.reset();
fGetAddr = false;
fRelayTxes = false;
pfilter = new CBloomFilter();
diff --git a/src/net.h b/src/net.h
index fb299fb0b..b0be3e652 100644
--- a/src/net.h
+++ b/src/net.h
@@ -386,7 +386,7 @@ public:
std::set<uint256> setKnown;
// inventory based relay
- mruset<CInv> setInventoryKnown;
+ CRollingBloomFilter setInventoryKnown;
std::vector<CInv> vInventoryToSend;
CCriticalSection cs_inventory;
std::multimap<int64_t, CInv> mapAskFor;
@@ -494,7 +494,7 @@ public:
{
{
LOCK(cs_inventory);
- setInventoryKnown.insert(inv);
+ setInventoryKnown.insert(inv.hash);
}
}
@@ -502,7 +502,7 @@ public:
{
{
LOCK(cs_inventory);
- if (!setInventoryKnown.count(inv))
+ if (!setInventoryKnown.contains(inv.hash))
vInventoryToSend.push_back(inv);
}
}