diff options
author | Matt Corallo <git@bluematt.me> | 2016-11-03 14:58:29 -0400 |
---|---|---|
committer | Matt Corallo <git@bluematt.me> | 2016-11-23 12:29:26 -0800 |
commit | d2b88f97a1235057290f9e8ca0bf11437ba919f8 (patch) | |
tree | 91cf817b80242a6c0e28a5353f3bc1bd750536cc /src/main.cpp | |
parent | 97e28029c94bc187721242a8c59468cebd73441b (diff) |
Move orphan-conflict removal from main logic into a callback
This makes the orphan map a part of net-processing logic instead
of main logic.
Diffstat (limited to 'src/main.cpp')
-rw-r--r-- | src/main.cpp | 56 |
1 files changed, 28 insertions, 28 deletions
diff --git a/src/main.cpp b/src/main.cpp index a5b0081363..025449ad69 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3085,34 +3085,6 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams, } // When we reach this point, we switched to a new tip (stored in pindexNewTip). - // Remove orphan transactions with cs_main - { - LOCK(cs_main); - for(unsigned int i = 0; i < txChanged.size(); i++) { - std::vector<uint256> vOrphanErase; - const CTransaction& tx = std::get<0>(txChanged[i]); - // Which orphan pool entries must we evict? - for (size_t j = 0; j < tx.vin.size(); j++) { - auto itByPrev = mapOrphanTransactionsByPrev.find(tx.vin[j].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 include or precluded by this block - if (vOrphanErase.size()) { - int nErased = 0; - BOOST_FOREACH(uint256 &orphanHash, vOrphanErase) { - nErased += EraseOrphanTx(orphanHash); - } - LogPrint("mempool", "Erased %d orphan tx included or conflicted by block\n", nErased); - } - } - } - // Notifications/callbacks that can run without cs_main // throw all transactions though the signal-interface @@ -4752,6 +4724,34 @@ PeerLogicValidation::PeerLogicValidation(CConnman* connmanIn) : connman(connmanI recentRejects.reset(new CRollingBloomFilter(120000, 0.000001)); } +void PeerLogicValidation::SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock) { + if (nPosInBlock == CMainSignals::SYNC_TRANSACTION_NOT_IN_BLOCK) + return; + + LOCK(cs_main); + + std::vector<uint256> vOrphanErase; + // Which orphan pool entries must we evict? + for (size_t j = 0; j < tx.vin.size(); j++) { + auto itByPrev = mapOrphanTransactionsByPrev.find(tx.vin[j].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 include or precluded by this block + if (vOrphanErase.size()) { + int nErased = 0; + BOOST_FOREACH(uint256 &orphanHash, vOrphanErase) { + nErased += EraseOrphanTx(orphanHash); + } + LogPrint("mempool", "Erased %d orphan tx included or conflicted by block\n", nErased); + } +} + void PeerLogicValidation::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) { const int nNewHeight = pindexNew->nHeight; connman->SetBestHeight(nNewHeight); |