aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatt Corallo <git@bluematt.me>2016-11-03 14:58:29 -0400
committerMatt Corallo <git@bluematt.me>2016-11-23 12:29:26 -0800
commitd2b88f97a1235057290f9e8ca0bf11437ba919f8 (patch)
tree91cf817b80242a6c0e28a5353f3bc1bd750536cc
parent97e28029c94bc187721242a8c59468cebd73441b (diff)
downloadbitcoin-d2b88f97a1235057290f9e8ca0bf11437ba919f8.tar.xz
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.
-rw-r--r--src/main.cpp56
-rw-r--r--src/main.h1
2 files changed, 29 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);
diff --git a/src/main.h b/src/main.h
index 678f0fd99d..6d4240c26c 100644
--- a/src/main.h
+++ b/src/main.h
@@ -560,6 +560,7 @@ private:
public:
PeerLogicValidation(CConnman* connmanIn);
+ virtual void SyncTransaction(const CTransaction& tx, const CBlockIndex* pindex, int nPosInBlock);
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload);
virtual void BlockChecked(const CBlock& block, const CValidationState& state);
};