From 03257b832debcb1470420d8657d30ba30f4be770 Mon Sep 17 00:00:00 2001 From: Anthony Towns Date: Sun, 31 Jan 2021 23:37:41 +1000 Subject: txorphanage: Extract EraseOrphansForBlock Extract code that erases orphans when a new block is found into EraseOrphansForBlock. --- src/net_processing.cpp | 32 ++------------------------------ src/txorphanage.cpp | 31 +++++++++++++++++++++++++++++++ src/txorphanage.h | 2 ++ 3 files changed, 35 insertions(+), 30 deletions(-) (limited to 'src') diff --git a/src/net_processing.cpp b/src/net_processing.cpp index 67a0c0e3d2..f1b5c6f38d 100644 --- a/src/net_processing.cpp +++ b/src/net_processing.cpp @@ -1261,37 +1261,9 @@ PeerManagerImpl::PeerManagerImpl(const CChainParams& chainparams, CConnman& conn */ void PeerManagerImpl::BlockConnected(const std::shared_ptr& pblock, const CBlockIndex* pindex) { - { - LOCK(g_cs_orphans); - - std::vector vOrphanErase; - - for (const CTransactionRef& ptx : pblock->vtx) { - const CTransaction& tx = *ptx; + EraseOrphansForBlock(*pblock); + m_last_tip_update = GetTime(); - // Which orphan pool entries must we evict? - for (const auto& txin : tx.vin) { - auto itByPrev = mapOrphanTransactionsByPrev.find(txin.prevout); - if (itByPrev == mapOrphanTransactionsByPrev.end()) continue; - for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) { - const CTransaction& orphanTx = *(*mi)->second.tx; - const uint256& orphanHash = orphanTx.GetHash(); - vOrphanErase.push_back(orphanHash); - } - } - } - - // Erase orphan transactions included or precluded by this block - if (vOrphanErase.size()) { - int nErased = 0; - for (const uint256& orphanHash : vOrphanErase) { - nErased += EraseOrphanTx(orphanHash); - } - LogPrint(BCLog::MEMPOOL, "Erased %d orphan tx included or conflicted by block\n", nErased); - } - - m_last_tip_update = GetTime(); - } { LOCK(m_recent_confirmed_transactions_mutex); for (const auto& ptx : pblock->vtx) { diff --git a/src/txorphanage.cpp b/src/txorphanage.cpp index 1527bdf5ea..45bc0885fa 100644 --- a/src/txorphanage.cpp +++ b/src/txorphanage.cpp @@ -175,3 +175,34 @@ std::pair GetOrphanTx(const uint256& txid) if (it == mapOrphanTransactions.end()) return {nullptr, -1}; return {it->second.tx, it->second.fromPeer}; } + +void EraseOrphansForBlock(const CBlock& block) +{ + LOCK(g_cs_orphans); + + std::vector vOrphanErase; + + for (const CTransactionRef& ptx : block.vtx) { + const CTransaction& tx = *ptx; + + // Which orphan pool entries must we evict? + for (const auto& txin : tx.vin) { + auto itByPrev = mapOrphanTransactionsByPrev.find(txin.prevout); + if (itByPrev == mapOrphanTransactionsByPrev.end()) continue; + for (auto mi = itByPrev->second.begin(); mi != itByPrev->second.end(); ++mi) { + const CTransaction& orphanTx = *(*mi)->second.tx; + const uint256& orphanHash = orphanTx.GetHash(); + vOrphanErase.push_back(orphanHash); + } + } + } + + // Erase orphan transactions included or precluded by this block + if (vOrphanErase.size()) { + int nErased = 0; + for (const uint256& orphanHash : vOrphanErase) { + nErased += EraseOrphanTx(orphanHash); + } + LogPrint(BCLog::MEMPOOL, "Erased %d orphan tx included or conflicted by block\n", nErased); + } +} diff --git a/src/txorphanage.h b/src/txorphanage.h index 1a72af175c..f2ffbf3d67 100644 --- a/src/txorphanage.h +++ b/src/txorphanage.h @@ -6,6 +6,7 @@ #define BITCOIN_TXORPHANAGE_H #include +#include #include #include @@ -22,6 +23,7 @@ struct COrphanTx { int EraseOrphanTx(const uint256& txid) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); void EraseOrphansFor(NodeId peer) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); +void EraseOrphansForBlock(const CBlock& block) EXCLUSIVE_LOCKS_REQUIRED(!g_cs_orphans); unsigned int LimitOrphanTxSize(unsigned int nMaxOrphans) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); void AddChildrenToWorkSet(const CTransaction& tx, std::set& orphan_work_set) EXCLUSIVE_LOCKS_REQUIRED(g_cs_orphans); bool HaveOrphanTx(const GenTxid& gtxid) EXCLUSIVE_LOCKS_REQUIRED(!g_cs_orphans); -- cgit v1.2.3