Skip to content

Commit 29eb219

Browse files
committed
move only: move implementation code to disconnected_transactions.cpp
1 parent 81dfedd commit 29eb219

File tree

3 files changed

+100
-69
lines changed

3 files changed

+100
-69
lines changed

src/Makefile.am

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -403,6 +403,7 @@ libbitcoin_node_a_SOURCES = \
403403
kernel/coinstats.cpp \
404404
kernel/context.cpp \
405405
kernel/cs_main.cpp \
406+
kernel/disconnected_transactions.cpp \
406407
kernel/mempool_persist.cpp \
407408
kernel/mempool_removal_reason.cpp \
408409
mapport.cpp \
@@ -943,6 +944,7 @@ libbitcoinkernel_la_SOURCES = \
943944
kernel/coinstats.cpp \
944945
kernel/context.cpp \
945946
kernel/cs_main.cpp \
947+
kernel/disconnected_transactions.cpp \
946948
kernel/mempool_persist.cpp \
947949
kernel/mempool_removal_reason.cpp \
948950
key.cpp \
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
// Copyright (c) 2023 The Bitcoin Core developers
2+
// Distributed under the MIT software license, see the accompanying
3+
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
4+
5+
#include <kernel/disconnected_transactions.h>
6+
7+
#include <assert.h>
8+
#include <core_memusage.h>
9+
#include <memusage.h>
10+
#include <primitives/transaction.h>
11+
#include <util/hasher.h>
12+
13+
#include <memory>
14+
#include <utility>
15+
16+
// It's almost certainly a logic bug if we don't clear out queuedTx before
17+
// destruction, as we add to it while disconnecting blocks, and then we
18+
// need to re-process remaining transactions to ensure mempool consistency.
19+
// For now, assert() that we've emptied out this object on destruction.
20+
// This assert() can always be removed if the reorg-processing code were
21+
// to be refactored such that this assumption is no longer true (for
22+
// instance if there was some other way we cleaned up the mempool after a
23+
// reorg, besides draining this object).
24+
DisconnectedBlockTransactions::~DisconnectedBlockTransactions()
25+
{
26+
assert(queuedTx.empty());
27+
assert(iters_by_txid.empty());
28+
assert(cachedInnerUsage == 0);
29+
}
30+
31+
std::vector<CTransactionRef> DisconnectedBlockTransactions::LimitMemoryUsage()
32+
{
33+
std::vector<CTransactionRef> evicted;
34+
35+
while (!queuedTx.empty() && DynamicMemoryUsage() > m_max_mem_usage) {
36+
evicted.emplace_back(queuedTx.front());
37+
cachedInnerUsage -= RecursiveDynamicUsage(*queuedTx.front());
38+
iters_by_txid.erase(queuedTx.front()->GetHash());
39+
queuedTx.pop_front();
40+
}
41+
return evicted;
42+
}
43+
44+
size_t DisconnectedBlockTransactions::DynamicMemoryUsage() const
45+
{
46+
return cachedInnerUsage + memusage::DynamicUsage(iters_by_txid) + memusage::DynamicUsage(queuedTx);
47+
}
48+
49+
[[nodiscard]] std::vector<CTransactionRef> DisconnectedBlockTransactions::AddTransactionsFromBlock(const std::vector<CTransactionRef>& vtx)
50+
{
51+
iters_by_txid.reserve(iters_by_txid.size() + vtx.size());
52+
for (auto block_it = vtx.rbegin(); block_it != vtx.rend(); ++block_it) {
53+
auto it = queuedTx.insert(queuedTx.end(), *block_it);
54+
iters_by_txid.emplace((*block_it)->GetHash(), it);
55+
cachedInnerUsage += RecursiveDynamicUsage(**block_it);
56+
}
57+
return LimitMemoryUsage();
58+
}
59+
60+
void DisconnectedBlockTransactions::removeForBlock(const std::vector<CTransactionRef>& vtx)
61+
{
62+
// Short-circuit in the common case of a block being added to the tip
63+
if (queuedTx.empty()) {
64+
return;
65+
}
66+
for (const auto& tx : vtx) {
67+
auto iter = iters_by_txid.find(tx->GetHash());
68+
if (iter != iters_by_txid.end()) {
69+
auto list_iter = iter->second;
70+
iters_by_txid.erase(iter);
71+
cachedInnerUsage -= RecursiveDynamicUsage(**list_iter);
72+
queuedTx.erase(list_iter);
73+
}
74+
}
75+
}
76+
77+
void DisconnectedBlockTransactions::clear()
78+
{
79+
cachedInnerUsage = 0;
80+
iters_by_txid.clear();
81+
queuedTx.clear();
82+
}
83+
84+
std::list<CTransactionRef> DisconnectedBlockTransactions::take()
85+
{
86+
std::list<CTransactionRef> ret = std::move(queuedTx);
87+
clear();
88+
return ret;
89+
}

src/kernel/disconnected_transactions.h

Lines changed: 9 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@
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

6350
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} {}
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

Comments
 (0)