txorphanage: make m_peer_work_set private

This commit is contained in:
Anthony Towns committed 2022-10-11 14:05:09 +10:00
1 parent 3614819864
commit a936f41a5d
4 files changed
+46 -25

No files matched your search

+6 -12
View File
@@ -2887,20 +2887,14 @@ bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
AssertLockHeld(cs_main); AssertLockHeld(cs_main);
AssertLockHeld(g_cs_orphans); AssertLockHeld(g_cs_orphans);
auto work_set_it = m_orphanage.m_peer_work_set.find(peer.m_id); CTransactionRef porphanTx = nullptr;
if (work_set_it == m_orphanage.m_peer_work_set.end()) return false; NodeId from_peer = -1;
bool more = false;
std::set<uint256>& orphan_work_set = work_set_it->second;
while (!orphan_work_set.empty()) {
const uint256 orphanHash = *orphan_work_set.begin();
orphan_work_set.erase(orphan_work_set.begin());
const auto [porphanTx, from_peer] = m_orphanage.GetTx(orphanHash);
if (porphanTx == nullptr) continue;
while (CTransactionRef porphanTx = m_orphanage.GetTxToReconsider(peer.m_id, from_peer, more)) {
const MempoolAcceptResult result = m_chainman.ProcessTransaction(porphanTx); const MempoolAcceptResult result = m_chainman.ProcessTransaction(porphanTx);
const TxValidationState& state = result.m_state; const TxValidationState& state = result.m_state;
const uint256& orphanHash = porphanTx->GetHash();
if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) { if (result.m_result_type == MempoolAcceptResult::ResultType::VALID) {
LogPrint(BCLog::MEMPOOL, " accepted orphan tx %s\n", orphanHash.ToString()); LogPrint(BCLog::MEMPOOL, " accepted orphan tx %s\n", orphanHash.ToString());
@@ -2957,7 +2951,7 @@ bool PeerManagerImpl::ProcessOrphanTx(Peer& peer)
} }
} }
return !orphan_work_set.empty(); return more;
} }
bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer, bool PeerManagerImpl::PrepareBlockFilterRequest(CNode& node, Peer& peer,
+9 -3
View File
@@ -89,11 +89,17 @@ FUZZ_TARGET_INIT(txorphan, initialize_orphanage)
orphanage.AddChildrenToWorkSet(*tx, peer_id); orphanage.AddChildrenToWorkSet(*tx, peer_id);
}, },
[&] { [&] {
bool have_tx = orphanage.HaveTx(GenTxid::Txid(tx->GetHash())) || orphanage.HaveTx(GenTxid::Wtxid(tx->GetHash()));
{ {
LOCK(g_cs_orphans); LOCK(g_cs_orphans);
bool get_tx = orphanage.GetTx(tx->GetHash()).first != nullptr; NodeId originator;
Assert(have_tx == get_tx); bool more = true;
CTransactionRef ref = orphanage.GetTxToReconsider(peer_id, originator, more);
if (!ref) {
Assert(!more);
} else {
bool have_tx = orphanage.HaveTx(GenTxid::Txid(ref->GetHash())) || orphanage.HaveTx(GenTxid::Wtxid(ref->GetHash()));
Assert(have_tx);
}
} }
}, },
[&] { [&] {
+18 -4
View File
@@ -167,13 +167,27 @@ bool TxOrphanage::HaveTx(const GenTxid& gtxid) const
} }
} }
std::pair<CTransactionRef, NodeId> TxOrphanage::GetTx(const uint256& txid) const CTransactionRef TxOrphanage::GetTxToReconsider(NodeId peer, NodeId& originator, bool& more)
{ {
AssertLockHeld(g_cs_orphans); AssertLockHeld(g_cs_orphans);
const auto it = m_orphans.find(txid); auto work_set_it = m_peer_work_set.find(peer);
if (it == m_orphans.end()) return {nullptr, -1}; if (work_set_it != m_peer_work_set.end()) {
return {it->second.tx, it->second.fromPeer}; auto& work_set = work_set_it->second;
while (!work_set.empty()) {
uint256 txid = *work_set.begin();
work_set.erase(work_set.begin());
const auto orphan_it = m_orphans.find(txid);
if (orphan_it != m_orphans.end()) {
more = !work_set.empty();
originator = orphan_it->second.fromPeer;
return orphan_it->second.tx;
}
}
}
more = false;
return nullptr;
} }
void TxOrphanage::EraseForBlock(const CBlock& block) void TxOrphanage::EraseForBlock(const CBlock& block)
+13 -6
View File
@@ -10,6 +10,9 @@
#include <primitives/transaction.h> #include <primitives/transaction.h>
#include <sync.h> #include <sync.h>
#include <map>
#include <set>
/** Guards orphan transactions */ /** Guards orphan transactions */
extern RecursiveMutex g_cs_orphans; extern RecursiveMutex g_cs_orphans;
@@ -26,10 +29,14 @@ public:
/** Check if we already have an orphan transaction (by txid or wtxid) */ /** Check if we already have an orphan transaction (by txid or wtxid) */
bool HaveTx(const GenTxid& gtxid) const LOCKS_EXCLUDED(::g_cs_orphans); bool HaveTx(const GenTxid& gtxid) const LOCKS_EXCLUDED(::g_cs_orphans);
/** Get an orphan transaction and its originating peer /** Extract a transaction from a peer's work set
* (Transaction ref will be nullptr if not found) * Returns nullptr and sets more to false if there are no transactions
* to work on. Otherwise returns the transaction reference, removes
* the transaction from the work set, and populates its arguments with
* the originating peer, and whether there are more orphans for this peer
* to work on after this tx.
*/ */
std::pair<CTransactionRef, NodeId> GetTx(const uint256& txid) const EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); CTransactionRef GetTxToReconsider(NodeId peer, NodeId& originator, bool& more) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
/** Erase an orphan by txid */ /** Erase an orphan by txid */
int EraseTx(const uint256& txid) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); int EraseTx(const uint256& txid) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
@@ -43,9 +50,6 @@ public:
/** Limit the orphanage to the given maximum */ /** Limit the orphanage to the given maximum */
void LimitOrphans(unsigned int max_orphans) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); void LimitOrphans(unsigned int max_orphans) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
/** Which peer provided a parent tx of orphans that need to be reconsidered */
std::map<NodeId, std::set<uint256>> m_peer_work_set GUARDED_BY(g_cs_orphans);
/** Add any orphans that list a particular tx as a parent into a peer's work set */ /** Add any orphans that list a particular tx as a parent into a peer's work set */
void AddChildrenToWorkSet(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); void AddChildrenToWorkSet(const CTransaction& tx, NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans);
@@ -68,6 +72,9 @@ protected:
* -maxorphantx/DEFAULT_MAX_ORPHAN_TRANSACTIONS */ * -maxorphantx/DEFAULT_MAX_ORPHAN_TRANSACTIONS */
std::map<uint256, OrphanTx> m_orphans GUARDED_BY(g_cs_orphans); std::map<uint256, OrphanTx> m_orphans GUARDED_BY(g_cs_orphans);
/** Which peer provided a parent tx of orphans that need to be reconsidered */
std::map<NodeId, std::set<uint256>> m_peer_work_set GUARDED_BY(g_cs_orphans);
using OrphanMap = decltype(m_orphans); using OrphanMap = decltype(m_orphans);
struct IteratorComparator struct IteratorComparator