v30.3-roots.1 · Commit 51: [PATCH 51/68] mempool: synchronize dynamic dust fee publication
src/test/mempool_tests.cpp
Before: src/test/mempool_tests.cpp · After: src/test/mempool_tests.cpp
File metadata
index 1d9ef4949e40927c5d126cd8b3e3a01299a31c9d..313c9725b3c6027a5428db4d2da91790fdc2cb4e 100644
Download original patch · Release notes
Diff rows 1–58 of 58. Line numbers refer to the original before/after files.
+ Added− RemovedUnmarked lines are context.
Scroll the code area horizontally to read long lines. The two line-number columns refer to before and after.
src/test/mempool_tests.cpp
CHANGED
|
@@ -4,6 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
#include <common/system.h>
|
|
6
6
|
#include <policy/policy.h>
|
|
7
|
+
#include <scheduler.h>
|
|
7
8
|
#include <test/util/txmempool.h>
|
|
8
9
|
#include <txmempool.h>
|
|
9
10
|
#include <util/time.h>
|
|
@@ -13,12 +14,51 @@
|
|
|
13
14
|
#include <boost/test/unit_test.hpp>
|
|
14
15
|
#include <array>
|
|
15
16
|
#include <limits>
|
|
17
|
+
#include <thread>
|
|
16
18
|
#include <vector>
|
|
17
19
|
|
|
18
20
|
BOOST_FIXTURE_TEST_SUITE(mempool_tests, TestingSetup)
|
|
19
21
|
|
|
20
22
|
static constexpr auto REMOVAL_REASON_DUMMY = MemPoolRemovalReason::REPLACED;
|
|
21
23
|
|
|
24
|
+
BOOST_AUTO_TEST_CASE(DynamicDustFeePublication)
|
|
25
|
+
{
|
|
26
|
+
CScheduler scheduler;
|
|
27
|
+
auto opts{MemPoolOptionsForTest(m_node)};
|
|
28
|
+
opts.scheduler = &scheduler;
|
|
29
|
+
opts.dust_relay_target = 1;
|
|
30
|
+
opts.dust_relay_multiplier = 1000;
|
|
31
|
+
opts.dust_relay_feerate = CFeeRate{3000};
|
|
32
|
+
bilingual_str error;
|
|
33
|
+
CTxMemPool pool{opts, error};
|
|
34
|
+
BOOST_REQUIRE(error.empty());
|
|
35
|
+
CMutableTransaction tx;
|
|
36
|
+
tx.vin.resize(1);
|
|
37
|
+
tx.vout.emplace_back(COIN, CScript{} << std::vector<unsigned char>(1100, 0));
|
|
38
|
+
const auto txref{MakeTransactionRef(tx)};
|
|
39
|
+
const CAmount fee{100000};
|
|
40
|
+
AddToMempool(pool, TestMemPoolEntryHelper{}.Fee(fee).FromTx(txref));
|
|
41
|
+
const auto vsize{WITH_LOCK(pool.cs, return pool.GetEntry(txref->GetHash())->GetTxSize())};
|
|
42
|
+
const CFeeRate expected{fee * 1000 / vsize};
|
|
43
|
+
BOOST_CHECK(pool.GetDustRelayFee() == opts.dust_relay_feerate);
|
|
44
|
+
pool.UpdateDynamicDustFeerate();
|
|
45
|
+
BOOST_CHECK_EQUAL(pool.GetDustRelayFee().GetFeePerK(), expected.GetFeePerK());
|
|
46
|
+
|
|
47
|
+
// Exercise the scheduler's writer concurrently with the public snapshot
|
|
48
|
+
// reader. The guarded state also exposes unsynchronized access to Clang's
|
|
49
|
+
// thread-safety analysis and race-detecting builds.
|
|
50
|
+
std::thread updater{[&] {
|
|
51
|
+
for (int i{0}; i < 1000; ++i) pool.UpdateDynamicDustFeerate();
|
|
52
|
+
}};
|
|
53
|
+
bool consistent{true};
|
|
54
|
+
for (int i{0}; i < 1000; ++i) consistent &= pool.GetDustRelayFee() == expected;
|
|
55
|
+
updater.join();
|
|
56
|
+
BOOST_CHECK(consistent);
|
|
57
|
+
WITH_LOCK(pool.cs, pool.removeRecursive(*txref, MemPoolRemovalReason::EXPIRY));
|
|
58
|
+
pool.UpdateDynamicDustFeerate();
|
|
59
|
+
BOOST_CHECK(pool.GetDustRelayFee() == opts.dust_relay_feerate);
|
|
60
|
+
}
|
|
61
|
+
|
|
22
62
|
BOOST_AUTO_TEST_CASE(MempoolExtraWeightBoundary)
|
|
23
63
|
{
|
|
24
64
|
CMutableTransaction tx;
|