Skip to content

Commit fa0c87f

Browse files
committed
[net processing] Lazily initialize m_recent_rejects_reconsiderable
1 parent 662e8db commit fa0c87f

File tree

1 file changed

+21
-10
lines changed

1 file changed

+21
-10
lines changed

src/net_processing.cpp

Lines changed: 21 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -930,7 +930,18 @@ class PeerManagerImpl final : public PeerManager
930930
*
931931
* Parameters are picked to be the same as m_recent_rejects, with the same rationale.
932932
*/
933-
CRollingBloomFilter m_recent_rejects_reconsiderable GUARDED_BY(m_tx_download_mutex){120'000, 0.000'001};
933+
std::unique_ptr<CRollingBloomFilter> m_recent_rejects_reconsiderable GUARDED_BY(m_tx_download_mutex){nullptr};
934+
935+
CRollingBloomFilter& RecentRejectsReconsiderableFilter() EXCLUSIVE_LOCKS_REQUIRED(m_tx_download_mutex)
936+
{
937+
AssertLockHeld(m_tx_download_mutex);
938+
939+
if (!m_recent_rejects_reconsiderable) {
940+
m_recent_rejects_reconsiderable = std::make_unique<CRollingBloomFilter>(120'000, 0.000'001);
941+
}
942+
943+
return *m_recent_rejects_reconsiderable;
944+
}
934945

935946
/*
936947
* Filter for transactions that have been recently confirmed.
@@ -2092,7 +2103,7 @@ void PeerManagerImpl::ActiveTipChange(const CBlockIndex& new_tip, bool is_ibd)
20922103
// to a timelock. Reset the rejection filters to give those transactions another chance if we
20932104
// see them again.
20942105
RecentRejectsFilter().reset();
2095-
m_recent_rejects_reconsiderable.reset();
2106+
RecentRejectsReconsiderableFilter().reset();
20962107
}
20972108
}
20982109

@@ -2311,7 +2322,7 @@ bool PeerManagerImpl::AlreadyHaveTx(const GenTxid& gtxid, bool include_reconside
23112322
if (m_orphanage.HaveTx(Wtxid::FromUint256(hash))) return true;
23122323
}
23132324

2314-
if (include_reconsiderable && m_recent_rejects_reconsiderable.contains(hash)) return true;
2325+
if (include_reconsiderable && RecentRejectsReconsiderableFilter().contains(hash)) return true;
23152326

23162327
if (m_recent_confirmed_transactions.contains(hash)) return true;
23172328

@@ -3206,7 +3217,7 @@ void PeerManagerImpl::ProcessInvalidTx(NodeId nodeid, const CTransactionRef& ptx
32063217
// If the result is TX_RECONSIDERABLE, add it to m_recent_rejects_reconsiderable
32073218
// because we should not download or submit this transaction by itself again, but may
32083219
// submit it as part of a package later.
3209-
m_recent_rejects_reconsiderable.insert(ptx->GetWitnessHash().ToUint256());
3220+
RecentRejectsReconsiderableFilter().insert(ptx->GetWitnessHash().ToUint256());
32103221
} else {
32113222
RecentRejectsFilter().insert(ptx->GetWitnessHash().ToUint256());
32123223
}
@@ -3277,7 +3288,7 @@ void PeerManagerImpl::ProcessPackageResult(const PackageToValidate& package_to_v
32773288
const auto& senders = package_to_validate.m_senders;
32783289

32793290
if (package_result.m_state.IsInvalid()) {
3280-
m_recent_rejects_reconsiderable.insert(GetPackageHash(package));
3291+
RecentRejectsReconsiderableFilter().insert(GetPackageHash(package));
32813292
}
32823293
// We currently only expect to process 1-parent-1-child packages. Remove if this changes.
32833294
if (!Assume(package.size() == 2)) return;
@@ -3331,7 +3342,7 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
33313342

33323343
const auto& parent_wtxid{ptx->GetWitnessHash()};
33333344

3334-
Assume(m_recent_rejects_reconsiderable.contains(parent_wtxid.ToUint256()));
3345+
Assume(RecentRejectsReconsiderableFilter().contains(parent_wtxid.ToUint256()));
33353346

33363347
// Prefer children from this peer. This helps prevent censorship attempts in which an attacker
33373348
// sends lots of fake children for the parent, and we (unluckily) keep selecting the fake
@@ -3343,7 +3354,7 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
33433354
// most recent) one efficiently.
33443355
for (const auto& child : cpfp_candidates_same_peer) {
33453356
Package maybe_cpfp_package{ptx, child};
3346-
if (!m_recent_rejects_reconsiderable.contains(GetPackageHash(maybe_cpfp_package))) {
3357+
if (!RecentRejectsReconsiderableFilter().contains(GetPackageHash(maybe_cpfp_package))) {
33473358
return PeerManagerImpl::PackageToValidate{ptx, child, nodeid, nodeid};
33483359
}
33493360
}
@@ -3370,7 +3381,7 @@ std::optional<PeerManagerImpl::PackageToValidate> PeerManagerImpl::Find1P1CPacka
33703381
// cached in m_recent_rejects_reconsiderable.
33713382
const auto [child_tx, child_sender] = cpfp_candidates_different_peer.at(index);
33723383
Package maybe_cpfp_package{ptx, child_tx};
3373-
if (!m_recent_rejects_reconsiderable.contains(GetPackageHash(maybe_cpfp_package))) {
3384+
if (!RecentRejectsReconsiderableFilter().contains(GetPackageHash(maybe_cpfp_package))) {
33743385
return PeerManagerImpl::PackageToValidate{ptx, child_tx, nodeid, child_sender};
33753386
}
33763387
}
@@ -4562,7 +4573,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
45624573
}
45634574
}
45644575

4565-
if (m_recent_rejects_reconsiderable.contains(wtxid)) {
4576+
if (RecentRejectsReconsiderableFilter().contains(wtxid)) {
45664577
// When a transaction is already in m_recent_rejects_reconsiderable, we shouldn't submit
45674578
// it by itself again. However, look for a matching child in the orphanage, as it is
45684579
// possible that they succeed as a package.
@@ -4623,7 +4634,7 @@ void PeerManagerImpl::ProcessMessage(CNode& pfrom, const std::string& msg_type,
46234634
if (RecentRejectsFilter().contains(parent_txid)) {
46244635
fRejectedParents = true;
46254636
break;
4626-
} else if (m_recent_rejects_reconsiderable.contains(parent_txid) && !m_mempool.exists(GenTxid::Txid(parent_txid))) {
4637+
} else if (RecentRejectsReconsiderableFilter().contains(parent_txid) && !m_mempool.exists(GenTxid::Txid(parent_txid))) {
46274638
// More than 1 parent in m_recent_rejects_reconsiderable: 1p1c will not be
46284639
// sufficient to accept this package, so just give up here.
46294640
if (rejected_parent_reconsiderable.has_value()) {

0 commit comments

Comments
 (0)