55#ifndef BITCOIN_KERNEL_DISCONNECTED_TRANSACTIONS_H
66#define BITCOIN_KERNEL_DISCONNECTED_TRANSACTIONS_H
77
8- #include < core_memusage.h>
9- #include < memusage.h>
108#include < primitives/transaction.h>
119#include < util/hasher.h>
1210
@@ -47,39 +45,15 @@ class DisconnectedBlockTransactions {
4745 std::unordered_map<uint256, TxList::iterator, SaltedTxidHasher> iters_by_txid;
4846
4947 /* * Trim the earliest-added entries until we are within memory bounds. */
50- std::vector<CTransactionRef> LimitMemoryUsage ()
51- {
52- std::vector<CTransactionRef> evicted;
53-
54- while (!queuedTx.empty () && DynamicMemoryUsage () > m_max_mem_usage) {
55- evicted.emplace_back (queuedTx.front ());
56- cachedInnerUsage -= RecursiveDynamicUsage (*queuedTx.front ());
57- iters_by_txid.erase (queuedTx.front ()->GetHash ());
58- queuedTx.pop_front ();
59- }
60- return evicted;
61- }
48+ std::vector<CTransactionRef> LimitMemoryUsage ();
6249
6350public:
64- DisconnectedBlockTransactions (size_t max_mem_usage) : m_max_mem_usage{max_mem_usage} {}
51+ DisconnectedBlockTransactions (size_t max_mem_usage)
52+ : m_max_mem_usage{max_mem_usage} {}
6553
66- // It's almost certainly a logic bug if we don't clear out queuedTx before
67- // destruction, as we add to it while disconnecting blocks, and then we
68- // need to re-process remaining transactions to ensure mempool consistency.
69- // For now, assert() that we've emptied out this object on destruction.
70- // This assert() can always be removed if the reorg-processing code were
71- // to be refactored such that this assumption is no longer true (for
72- // instance if there was some other way we cleaned up the mempool after a
73- // reorg, besides draining this object).
74- ~DisconnectedBlockTransactions () {
75- assert (queuedTx.empty ());
76- assert (iters_by_txid.empty ());
77- assert (cachedInnerUsage == 0 );
78- }
54+ ~DisconnectedBlockTransactions ();
7955
80- size_t DynamicMemoryUsage () const {
81- return cachedInnerUsage + memusage::DynamicUsage (iters_by_txid) + memusage::DynamicUsage (queuedTx);
82- }
56+ size_t DynamicMemoryUsage () const ;
8357
8458 /* * Add transactions from the block, iterating through vtx in reverse order. Callers should call
8559 * this function for blocks in descending order by block height.
@@ -88,50 +62,16 @@ class DisconnectedBlockTransactions {
8862 * corresponding entry in iters_by_txid.
8963 * @returns vector of transactions that were evicted for size-limiting.
9064 */
91- [[nodiscard]] std::vector<CTransactionRef> AddTransactionsFromBlock (const std::vector<CTransactionRef>& vtx)
92- {
93- iters_by_txid.reserve (iters_by_txid.size () + vtx.size ());
94- for (auto block_it = vtx.rbegin (); block_it != vtx.rend (); ++block_it) {
95- auto it = queuedTx.insert (queuedTx.end (), *block_it);
96- iters_by_txid.emplace ((*block_it)->GetHash (), it);
97- cachedInnerUsage += RecursiveDynamicUsage (**block_it);
98- }
99- return LimitMemoryUsage ();
100- }
65+ [[nodiscard]] std::vector<CTransactionRef> AddTransactionsFromBlock (const std::vector<CTransactionRef>& vtx);
10166
10267 /* * Remove any entries that are in this block. */
103- void removeForBlock (const std::vector<CTransactionRef>& vtx)
104- {
105- // Short-circuit in the common case of a block being added to the tip
106- if (queuedTx.empty ()) {
107- return ;
108- }
109- for (const auto & tx : vtx) {
110- auto iter = iters_by_txid.find (tx->GetHash ());
111- if (iter != iters_by_txid.end ()) {
112- auto list_iter = iter->second ;
113- iters_by_txid.erase (iter);
114- cachedInnerUsage -= RecursiveDynamicUsage (**list_iter);
115- queuedTx.erase (list_iter);
116- }
117- }
118- }
68+ void removeForBlock (const std::vector<CTransactionRef>& vtx);
11969
12070 size_t size () const { return queuedTx.size (); }
12171
122- void clear ()
123- {
124- cachedInnerUsage = 0 ;
125- iters_by_txid.clear ();
126- queuedTx.clear ();
127- }
72+ void clear ();
12873
12974 /* * Clear all data structures and return the list of transactions. */
130- std::list<CTransactionRef> take ()
131- {
132- std::list<CTransactionRef> ret = std::move (queuedTx);
133- clear ();
134- return ret;
135- }
75+ std::list<CTransactionRef> take ();
13676};
13777#endif // BITCOIN_KERNEL_DISCONNECTED_TRANSACTIONS_H
0 commit comments