Skip to content

Commit 0ad7d7a

Browse files
committed
test: chainstate write test for periodic chainstate flush
1 parent 9355578 commit 0ad7d7a

File tree

4 files changed

+50
-4
lines changed

4 files changed

+50
-4
lines changed

src/test/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ add_executable(test_bitcoin
4747
blockmanager_tests.cpp
4848
bloom_tests.cpp
4949
bswap_tests.cpp
50+
chainstate_write_tests.cpp
5051
checkqueue_tests.cpp
5152
cluster_linearize_tests.cpp
5253
coins_tests.cpp

src/test/chainstate_write_tests.cpp

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
// Copyright (c) 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 <test/util/setup_common.h>
6+
#include <validation.h>
7+
#include <validationinterface.h>
8+
9+
#include <boost/test/unit_test.hpp>
10+
11+
BOOST_AUTO_TEST_SUITE(chainstate_write_tests)
12+
13+
BOOST_FIXTURE_TEST_CASE(chainstate_write_interval, TestingSetup)
14+
{
15+
struct TestSubscriber final : CValidationInterface {
16+
bool m_did_flush{false};
17+
void ChainStateFlushed(ChainstateRole, const CBlockLocator&) override
18+
{
19+
m_did_flush = true;
20+
}
21+
};
22+
23+
const auto sub{std::make_shared<TestSubscriber>()};
24+
m_node.validation_signals->RegisterSharedValidationInterface(sub);
25+
auto& chainstate{Assert(m_node.chainman)->ActiveChainstate()};
26+
BlockValidationState state_dummy{};
27+
28+
// The first periodic flush sets m_last_flush and does not flush
29+
chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC);
30+
m_node.validation_signals->SyncWithValidationInterfaceQueue();
31+
BOOST_CHECK(!sub->m_did_flush);
32+
33+
SetMockTime(GetTime<std::chrono::minutes>() + 23h + 59min);
34+
chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC);
35+
m_node.validation_signals->SyncWithValidationInterfaceQueue();
36+
BOOST_CHECK(!sub->m_did_flush);
37+
38+
SetMockTime(GetTime<std::chrono::minutes>() + 24h);
39+
chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC);
40+
m_node.validation_signals->SyncWithValidationInterfaceQueue();
41+
BOOST_CHECK(sub->m_did_flush);
42+
}
43+
44+
BOOST_AUTO_TEST_SUITE_END()

src/validation.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2878,7 +2878,7 @@ bool Chainstate::FlushStateToDisk(
28782878
}
28792879
}
28802880
}
2881-
const auto nNow{SteadyClock::now()};
2881+
const auto nNow{NodeClock::now()};
28822882
// Avoid writing/flushing immediately after startup.
28832883
if (m_last_write == decltype(m_last_write){}) {
28842884
m_last_write = nNow;
@@ -2951,7 +2951,7 @@ bool Chainstate::FlushStateToDisk(
29512951
m_last_flush = nNow;
29522952
full_flush_completed = true;
29532953
TRACEPOINT(utxocache, flush,
2954-
int64_t{Ticks<std::chrono::microseconds>(SteadyClock::now() - nNow)},
2954+
int64_t{Ticks<std::chrono::microseconds>(NodeClock::now() - nNow)},
29552955
(uint32_t)mode,
29562956
(uint64_t)coins_count,
29572957
(uint64_t)coins_mem_usage,

src/validation.h

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
#include <util/fs.h>
3232
#include <util/hasher.h>
3333
#include <util/result.h>
34+
#include <util/time.h>
3435
#include <util/translation.h>
3536
#include <versionbits.h>
3637

@@ -802,8 +803,8 @@ class Chainstate
802803
void UpdateTip(const CBlockIndex* pindexNew)
803804
EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
804805

805-
SteadyClock::time_point m_last_write{};
806-
SteadyClock::time_point m_last_flush{};
806+
NodeClock::time_point m_last_write{};
807+
NodeClock::time_point m_last_flush{};
807808

808809
/**
809810
* In case of an invalid snapshot, rename the coins leveldb directory so

0 commit comments

Comments
 (0)