5
5
#ifndef BITCOIN_KERNEL_DISCONNECTED_TRANSACTIONS_H
6
6
#define BITCOIN_KERNEL_DISCONNECTED_TRANSACTIONS_H
7
7
8
- #include < core_memusage.h>
9
- #include < memusage.h>
10
8
#include < primitives/transaction.h>
11
9
#include < util/hasher.h>
12
10
@@ -47,39 +45,15 @@ class DisconnectedBlockTransactions {
47
45
std::unordered_map<uint256, TxList::iterator, SaltedTxidHasher> iters_by_txid;
48
46
49
47
/* * 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 ();
62
49
63
50
public:
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} {}
65
53
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 ();
79
55
80
- size_t DynamicMemoryUsage () const {
81
- return cachedInnerUsage + memusage::DynamicUsage (iters_by_txid) + memusage::DynamicUsage (queuedTx);
82
- }
56
+ size_t DynamicMemoryUsage () const ;
83
57
84
58
/* * Add transactions from the block, iterating through vtx in reverse order. Callers should call
85
59
* this function for blocks in descending order by block height.
@@ -88,50 +62,16 @@ class DisconnectedBlockTransactions {
88
62
* corresponding entry in iters_by_txid.
89
63
* @returns vector of transactions that were evicted for size-limiting.
90
64
*/
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);
101
66
102
67
/* * 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);
119
69
120
70
size_t size () const { return queuedTx.size (); }
121
71
122
- void clear ()
123
- {
124
- cachedInnerUsage = 0 ;
125
- iters_by_txid.clear ();
126
- queuedTx.clear ();
127
- }
72
+ void clear ();
128
73
129
74
/* * 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 ();
136
76
};
137
77
#endif // BITCOIN_KERNEL_DISCONNECTED_TRANSACTIONS_H
0 commit comments