Also call other wallet notify callbacks in scheduler thread
This runs Block{Connected,Disconnected}, SetBestChain, Inventory, and TransactionAddedToMempool on the background scheduler thread. Of those, only BlockConnected is used outside of Wallet/ZMQ, and is used only for orphan transaction removal in net_processing, something which does not need to be synchronous with anything else. This partially reverts #9583, re-enabling some of the gains from #7946. This does not, however, re-enable the gains achieved by repeatedly releasing cs_main between each transaction processed.
This commit is contained in:
parent
17220d6325
commit
e545dedf72
3 changed files with 40 additions and 12 deletions
|
@ -2469,7 +2469,7 @@ bool ActivateBestChain(CValidationState &state, const CChainParams& chainparams,
|
||||||
|
|
||||||
for (const PerBlockConnectTrace& trace : connectTrace.GetBlocksConnected()) {
|
for (const PerBlockConnectTrace& trace : connectTrace.GetBlocksConnected()) {
|
||||||
assert(trace.pblock && trace.pindex);
|
assert(trace.pblock && trace.pindex);
|
||||||
GetMainSignals().BlockConnected(trace.pblock, trace.pindex, *trace.conflictedTxs);
|
GetMainSignals().BlockConnected(trace.pblock, trace.pindex, trace.conflictedTxs);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// When we reach this point, we switched to a new tip (stored in pindexNewTip).
|
// When we reach this point, we switched to a new tip (stored in pindexNewTip).
|
||||||
|
|
|
@ -121,23 +121,33 @@ void CMainSignals::UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockInd
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::TransactionAddedToMempool(const CTransactionRef &ptx) {
|
void CMainSignals::TransactionAddedToMempool(const CTransactionRef &ptx) {
|
||||||
|
m_internals->m_schedulerClient.AddToProcessQueue([ptx, this] {
|
||||||
m_internals->TransactionAddedToMempool(ptx);
|
m_internals->TransactionAddedToMempool(ptx);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::BlockConnected(const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, const std::vector<CTransactionRef>& vtxConflicted) {
|
void CMainSignals::BlockConnected(const std::shared_ptr<const CBlock> &pblock, const CBlockIndex *pindex, const std::shared_ptr<const std::vector<CTransactionRef>>& pvtxConflicted) {
|
||||||
m_internals->BlockConnected(pblock, pindex, vtxConflicted);
|
m_internals->m_schedulerClient.AddToProcessQueue([pblock, pindex, pvtxConflicted, this] {
|
||||||
|
m_internals->BlockConnected(pblock, pindex, *pvtxConflicted);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock> &pblock) {
|
void CMainSignals::BlockDisconnected(const std::shared_ptr<const CBlock> &pblock) {
|
||||||
|
m_internals->m_schedulerClient.AddToProcessQueue([pblock, this] {
|
||||||
m_internals->BlockDisconnected(pblock);
|
m_internals->BlockDisconnected(pblock);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::SetBestChain(const CBlockLocator &locator) {
|
void CMainSignals::SetBestChain(const CBlockLocator &locator) {
|
||||||
|
m_internals->m_schedulerClient.AddToProcessQueue([locator, this] {
|
||||||
m_internals->SetBestChain(locator);
|
m_internals->SetBestChain(locator);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::Inventory(const uint256 &hash) {
|
void CMainSignals::Inventory(const uint256 &hash) {
|
||||||
|
m_internals->m_schedulerClient.AddToProcessQueue([hash, this] {
|
||||||
m_internals->Inventory(hash);
|
m_internals->Inventory(hash);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void CMainSignals::Broadcast(int64_t nBestBlockTime, CConnman* connman) {
|
void CMainSignals::Broadcast(int64_t nBestBlockTime, CConnman* connman) {
|
||||||
|
|
|
@ -47,7 +47,11 @@ class CValidationInterface {
|
||||||
protected:
|
protected:
|
||||||
/** Notifies listeners of updated block chain tip */
|
/** Notifies listeners of updated block chain tip */
|
||||||
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {}
|
virtual void UpdatedBlockTip(const CBlockIndex *pindexNew, const CBlockIndex *pindexFork, bool fInitialDownload) {}
|
||||||
/** Notifies listeners of a transaction having been added to mempool. */
|
/**
|
||||||
|
* Notifies listeners of a transaction having been added to mempool.
|
||||||
|
*
|
||||||
|
* Called on a background thread.
|
||||||
|
*/
|
||||||
virtual void TransactionAddedToMempool(const CTransactionRef &ptxn) {}
|
virtual void TransactionAddedToMempool(const CTransactionRef &ptxn) {}
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of a transaction leaving mempool.
|
* Notifies listeners of a transaction leaving mempool.
|
||||||
|
@ -63,13 +67,27 @@ protected:
|
||||||
/**
|
/**
|
||||||
* Notifies listeners of a block being connected.
|
* Notifies listeners of a block being connected.
|
||||||
* Provides a vector of transactions evicted from the mempool as a result.
|
* Provides a vector of transactions evicted from the mempool as a result.
|
||||||
|
*
|
||||||
|
* Called on a background thread.
|
||||||
*/
|
*/
|
||||||
virtual void BlockConnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex, const std::vector<CTransactionRef> &txnConflicted) {}
|
virtual void BlockConnected(const std::shared_ptr<const CBlock> &block, const CBlockIndex *pindex, const std::vector<CTransactionRef> &txnConflicted) {}
|
||||||
/** Notifies listeners of a block being disconnected */
|
/**
|
||||||
|
* Notifies listeners of a block being disconnected
|
||||||
|
*
|
||||||
|
* Called on a background thread.
|
||||||
|
*/
|
||||||
virtual void BlockDisconnected(const std::shared_ptr<const CBlock> &block) {}
|
virtual void BlockDisconnected(const std::shared_ptr<const CBlock> &block) {}
|
||||||
/** Notifies listeners of the new active block chain on-disk. */
|
/**
|
||||||
|
* Notifies listeners of the new active block chain on-disk.
|
||||||
|
*
|
||||||
|
* Called on a background thread.
|
||||||
|
*/
|
||||||
virtual void SetBestChain(const CBlockLocator &locator) {}
|
virtual void SetBestChain(const CBlockLocator &locator) {}
|
||||||
/** Notifies listeners about an inventory item being seen on the network. */
|
/**
|
||||||
|
* Notifies listeners about an inventory item being seen on the network.
|
||||||
|
*
|
||||||
|
* Called on a background thread.
|
||||||
|
*/
|
||||||
virtual void Inventory(const uint256 &hash) {}
|
virtual void Inventory(const uint256 &hash) {}
|
||||||
/** Tells listeners to broadcast their data. */
|
/** Tells listeners to broadcast their data. */
|
||||||
virtual void ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman) {}
|
virtual void ResendWalletTransactions(int64_t nBestBlockTime, CConnman* connman) {}
|
||||||
|
@ -116,7 +134,7 @@ public:
|
||||||
|
|
||||||
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
void UpdatedBlockTip(const CBlockIndex *, const CBlockIndex *, bool fInitialDownload);
|
||||||
void TransactionAddedToMempool(const CTransactionRef &);
|
void TransactionAddedToMempool(const CTransactionRef &);
|
||||||
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::vector<CTransactionRef> &);
|
void BlockConnected(const std::shared_ptr<const CBlock> &, const CBlockIndex *pindex, const std::shared_ptr<const std::vector<CTransactionRef>> &);
|
||||||
void BlockDisconnected(const std::shared_ptr<const CBlock> &);
|
void BlockDisconnected(const std::shared_ptr<const CBlock> &);
|
||||||
void SetBestChain(const CBlockLocator &);
|
void SetBestChain(const CBlockLocator &);
|
||||||
void Inventory(const uint256 &);
|
void Inventory(const uint256 &);
|
||||||
|
|
Loading…
Reference in a new issue