@@ -958,7 +958,18 @@ class PeerManagerImpl final : public PeerManager
958
958
* transaction per day that would be inadvertently ignored (which is the
959
959
* same probability that we have in the reject filter).
960
960
*/
961
- CRollingBloomFilter m_recent_confirmed_transactions GUARDED_BY (m_tx_download_mutex){48'000 , 0.000'001 };
961
+ std::unique_ptr<CRollingBloomFilter> m_recent_confirmed_transactions GUARDED_BY (m_tx_download_mutex){nullptr };
962
+
963
+ CRollingBloomFilter& RecentConfirmedTransactionsFilter () EXCLUSIVE_LOCKS_REQUIRED(m_tx_download_mutex)
964
+ {
965
+ AssertLockHeld (m_tx_download_mutex);
966
+
967
+ if (!m_recent_confirmed_transactions) {
968
+ m_recent_confirmed_transactions = std::make_unique<CRollingBloomFilter>(48'000 , 0.000'001 );
969
+ }
970
+
971
+ return *m_recent_confirmed_transactions;
972
+ }
962
973
963
974
/* *
964
975
* For sending `inv`s to inbound peers, we use a single (exponentially
@@ -2141,9 +2152,9 @@ void PeerManagerImpl::BlockConnected(
2141
2152
m_orphanage.EraseForBlock (*pblock);
2142
2153
2143
2154
for (const auto & ptx : pblock->vtx ) {
2144
- m_recent_confirmed_transactions .insert (ptx->GetHash ().ToUint256 ());
2155
+ RecentConfirmedTransactionsFilter () .insert (ptx->GetHash ().ToUint256 ());
2145
2156
if (ptx->HasWitness ()) {
2146
- m_recent_confirmed_transactions .insert (ptx->GetWitnessHash ().ToUint256 ());
2157
+ RecentConfirmedTransactionsFilter () .insert (ptx->GetWitnessHash ().ToUint256 ());
2147
2158
}
2148
2159
m_txrequest.ForgetTxHash (ptx->GetHash ());
2149
2160
m_txrequest.ForgetTxHash (ptx->GetWitnessHash ());
@@ -2161,7 +2172,7 @@ void PeerManagerImpl::BlockDisconnected(const std::shared_ptr<const CBlock> &blo
2161
2172
// presumably the most common case of relaying a confirmed transaction
2162
2173
// should be just after a new block containing it is found.
2163
2174
LOCK (m_tx_download_mutex);
2164
- m_recent_confirmed_transactions .reset ();
2175
+ RecentConfirmedTransactionsFilter () .reset ();
2165
2176
}
2166
2177
2167
2178
/* *
@@ -2324,7 +2335,7 @@ bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid, bool include_reconside
2324
2335
2325
2336
if (include_reconsiderable && RecentRejectsReconsiderableFilter ().contains (hash)) return true ;
2326
2337
2327
- if (m_recent_confirmed_transactions .contains (hash)) return true ;
2338
+ if (RecentConfirmedTransactionsFilter () .contains (hash)) return true ;
2328
2339
2329
2340
return RecentRejectsFilter ().contains (hash) || m_mempool.exists (gtxid);
2330
2341
}
0 commit comments