From 0ad7d7abdbcffc11a46413545a214a716f56dc95 Mon Sep 17 00:00:00 2001 From: Andrew Toth Date: Sat, 31 Aug 2024 13:41:51 -0400 Subject: [PATCH] test: chainstate write test for periodic chainstate flush --- src/test/CMakeLists.txt | 1 + src/test/chainstate_write_tests.cpp | 44 +++++++++++++++++++++++++++++ src/validation.cpp | 4 +-- src/validation.h | 5 ++-- 4 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 src/test/chainstate_write_tests.cpp diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 859b9132067..95b43a0aade 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -47,6 +47,7 @@ add_executable(test_bitcoin blockmanager_tests.cpp bloom_tests.cpp bswap_tests.cpp + chainstate_write_tests.cpp checkqueue_tests.cpp cluster_linearize_tests.cpp coins_tests.cpp diff --git a/src/test/chainstate_write_tests.cpp b/src/test/chainstate_write_tests.cpp new file mode 100644 index 00000000000..3d285eb3b01 --- /dev/null +++ b/src/test/chainstate_write_tests.cpp @@ -0,0 +1,44 @@ +// Copyright (c) The Bitcoin Core developers +// Distributed under the MIT software license, see the accompanying +// file COPYING or http://www.opensource.org/licenses/mit-license.php. + +#include +#include +#include + +#include + +BOOST_AUTO_TEST_SUITE(chainstate_write_tests) + +BOOST_FIXTURE_TEST_CASE(chainstate_write_interval, TestingSetup) +{ + struct TestSubscriber final : CValidationInterface { + bool m_did_flush{false}; + void ChainStateFlushed(ChainstateRole, const CBlockLocator&) override + { + m_did_flush = true; + } + }; + + const auto sub{std::make_shared()}; + m_node.validation_signals->RegisterSharedValidationInterface(sub); + auto& chainstate{Assert(m_node.chainman)->ActiveChainstate()}; + BlockValidationState state_dummy{}; + + // The first periodic flush sets m_last_flush and does not flush + chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC); + m_node.validation_signals->SyncWithValidationInterfaceQueue(); + BOOST_CHECK(!sub->m_did_flush); + + SetMockTime(GetTime() + 23h + 59min); + chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC); + m_node.validation_signals->SyncWithValidationInterfaceQueue(); + BOOST_CHECK(!sub->m_did_flush); + + SetMockTime(GetTime() + 24h); + chainstate.FlushStateToDisk(state_dummy, FlushStateMode::PERIODIC); + m_node.validation_signals->SyncWithValidationInterfaceQueue(); + BOOST_CHECK(sub->m_did_flush); +} + +BOOST_AUTO_TEST_SUITE_END() diff --git a/src/validation.cpp b/src/validation.cpp index 191d80ef06f..c5e603e9322 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -2878,7 +2878,7 @@ bool Chainstate::FlushStateToDisk( } } } - const auto nNow{SteadyClock::now()}; + const auto nNow{NodeClock::now()}; // Avoid writing/flushing immediately after startup. if (m_last_write == decltype(m_last_write){}) { m_last_write = nNow; @@ -2951,7 +2951,7 @@ bool Chainstate::FlushStateToDisk( m_last_flush = nNow; full_flush_completed = true; TRACEPOINT(utxocache, flush, - int64_t{Ticks(SteadyClock::now() - nNow)}, + int64_t{Ticks(NodeClock::now() - nNow)}, (uint32_t)mode, (uint64_t)coins_count, (uint64_t)coins_mem_usage, diff --git a/src/validation.h b/src/validation.h index e2ff5925c58..3add3df4810 100644 --- a/src/validation.h +++ b/src/validation.h @@ -31,6 +31,7 @@ #include #include #include +#include #include #include @@ -802,8 +803,8 @@ private: void UpdateTip(const CBlockIndex* pindexNew) EXCLUSIVE_LOCKS_REQUIRED(::cs_main); - SteadyClock::time_point m_last_write{}; - SteadyClock::time_point m_last_flush{}; + NodeClock::time_point m_last_write{}; + NodeClock::time_point m_last_flush{}; /** * In case of an invalid snapshot, rename the coins leveldb directory so