mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-13 10:21:34 +02:00
bench: basic block filter index initial sync
Introduce benchmark for the block filter index sync. And makes synchronous 'Sync()' mechanism accessible.
This commit is contained in:
parent
d14c7286b6
commit
bcbd7eb8d4
@ -34,6 +34,7 @@ bench_bench_bitcoin_SOURCES = \
|
|||||||
bench/examples.cpp \
|
bench/examples.cpp \
|
||||||
bench/gcs_filter.cpp \
|
bench/gcs_filter.cpp \
|
||||||
bench/hashpadding.cpp \
|
bench/hashpadding.cpp \
|
||||||
|
bench/index_blockfilter.cpp \
|
||||||
bench/load_external.cpp \
|
bench/load_external.cpp \
|
||||||
bench/lockedpool.cpp \
|
bench/lockedpool.cpp \
|
||||||
bench/logging.cpp \
|
bench/logging.cpp \
|
||||||
|
43
src/bench/index_blockfilter.cpp
Normal file
43
src/bench/index_blockfilter.cpp
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
// Copyright (c) 2023-present The Bitcoin Core developers
|
||||||
|
// Distributed under the MIT software license, see the accompanying
|
||||||
|
// file COPYING or https://www.opensource.org/licenses/mit-license.php.
|
||||||
|
|
||||||
|
#include <bench/bench.h>
|
||||||
|
|
||||||
|
#include <addresstype.h>
|
||||||
|
#include <index/blockfilterindex.h>
|
||||||
|
#include <node/chainstate.h>
|
||||||
|
#include <node/context.h>
|
||||||
|
#include <test/util/setup_common.h>
|
||||||
|
#include <util/strencodings.h>
|
||||||
|
|
||||||
|
// Very simple block filter index sync benchmark, only using coinbase outputs.
|
||||||
|
static void BlockFilterIndexSync(benchmark::Bench& bench)
|
||||||
|
{
|
||||||
|
const auto test_setup = MakeNoLogFileContext<TestChain100Setup>();
|
||||||
|
|
||||||
|
// Create more blocks
|
||||||
|
int CHAIN_SIZE = 600;
|
||||||
|
CPubKey pubkey{ParseHex("02ed26169896db86ced4cbb7b3ecef9859b5952825adbeab998fb5b307e54949c9")};
|
||||||
|
CScript script = GetScriptForDestination(WitnessV0KeyHash(pubkey));
|
||||||
|
std::vector<CMutableTransaction> noTxns;
|
||||||
|
for (int i = 0; i < CHAIN_SIZE - 100; i++) {
|
||||||
|
test_setup->CreateAndProcessBlock(noTxns, script);
|
||||||
|
SetMockTime(GetTime() + 1);
|
||||||
|
}
|
||||||
|
assert(WITH_LOCK(::cs_main, return test_setup->m_node.chainman->ActiveHeight() == CHAIN_SIZE));
|
||||||
|
|
||||||
|
bench.minEpochIterations(5).run([&] {
|
||||||
|
BlockFilterIndex filter_index(interfaces::MakeChain(test_setup->m_node), BlockFilterType::BASIC,
|
||||||
|
/*n_cache_size=*/0, /*f_memory=*/false, /*f_wipe=*/true);
|
||||||
|
assert(filter_index.Init());
|
||||||
|
assert(!filter_index.BlockUntilSyncedToCurrentChain());
|
||||||
|
filter_index.Sync();
|
||||||
|
|
||||||
|
IndexSummary summary = filter_index.GetSummary();
|
||||||
|
assert(summary.synced);
|
||||||
|
assert(summary.best_block_hash == WITH_LOCK(::cs_main, return test_setup->m_node.chainman->ActiveTip()->GetBlockHash()));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
BENCHMARK(BlockFilterIndexSync, benchmark::PriorityLevel::HIGH);
|
@ -141,7 +141,7 @@ static const CBlockIndex* NextSyncBlock(const CBlockIndex* pindex_prev, CChain&
|
|||||||
return chain.Next(chain.FindFork(pindex_prev));
|
return chain.Next(chain.FindFork(pindex_prev));
|
||||||
}
|
}
|
||||||
|
|
||||||
void BaseIndex::ThreadSync()
|
void BaseIndex::Sync()
|
||||||
{
|
{
|
||||||
const CBlockIndex* pindex = m_best_block_index.load();
|
const CBlockIndex* pindex = m_best_block_index.load();
|
||||||
if (!m_synced) {
|
if (!m_synced) {
|
||||||
@ -394,7 +394,7 @@ bool BaseIndex::StartBackgroundSync()
|
|||||||
{
|
{
|
||||||
if (!m_init) throw std::logic_error("Error: Cannot start a non-initialized index");
|
if (!m_init) throw std::logic_error("Error: Cannot start a non-initialized index");
|
||||||
|
|
||||||
m_thread_sync = std::thread(&util::TraceThread, GetName(), [this] { ThreadSync(); });
|
m_thread_sync = std::thread(&util::TraceThread, GetName(), [this] { Sync(); });
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,13 +78,6 @@ private:
|
|||||||
std::thread m_thread_sync;
|
std::thread m_thread_sync;
|
||||||
CThreadInterrupt m_interrupt;
|
CThreadInterrupt m_interrupt;
|
||||||
|
|
||||||
/// Sync the index with the block index starting from the current best block.
|
|
||||||
/// Intended to be run in its own thread, m_thread_sync, and can be
|
|
||||||
/// interrupted with m_interrupt. Once the index gets in sync, the m_synced
|
|
||||||
/// flag is set and the BlockConnected ValidationInterface callback takes
|
|
||||||
/// over and the sync thread exits.
|
|
||||||
void ThreadSync();
|
|
||||||
|
|
||||||
/// Write the current index state (eg. chain block locator and subclass-specific items) to disk.
|
/// Write the current index state (eg. chain block locator and subclass-specific items) to disk.
|
||||||
///
|
///
|
||||||
/// Recommendations for error handling:
|
/// Recommendations for error handling:
|
||||||
@ -152,9 +145,16 @@ public:
|
|||||||
/// validation interface so that it stays in sync with blockchain updates.
|
/// validation interface so that it stays in sync with blockchain updates.
|
||||||
[[nodiscard]] bool Init();
|
[[nodiscard]] bool Init();
|
||||||
|
|
||||||
/// Starts the initial sync process.
|
/// Starts the initial sync process on a background thread.
|
||||||
[[nodiscard]] bool StartBackgroundSync();
|
[[nodiscard]] bool StartBackgroundSync();
|
||||||
|
|
||||||
|
/// Sync the index with the block index starting from the current best block.
|
||||||
|
/// Intended to be run in its own thread, m_thread_sync, and can be
|
||||||
|
/// interrupted with m_interrupt. Once the index gets in sync, the m_synced
|
||||||
|
/// flag is set and the BlockConnected ValidationInterface callback takes
|
||||||
|
/// over and the sync thread exits.
|
||||||
|
void Sync();
|
||||||
|
|
||||||
/// Stops the instance from staying in sync with blockchain updates.
|
/// Stops the instance from staying in sync with blockchain updates.
|
||||||
void Stop();
|
void Stop();
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user