aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfurszy <matiasfurszyfer@protonmail.com>2023-11-25 12:10:52 -0300
committerfurszy <matiasfurszyfer@protonmail.com>2024-03-12 09:30:42 -0300
commitbcbd7eb8d40fbbd0e58c61acef087d65f2047036 (patch)
tree4e64d2e5e8c214aa5fddf48a0fed8c7fbb41e342
parentd14c7286b653ad09a5a196aa351b325f97db546b (diff)
downloadbitcoin-bcbd7eb8d40fbbd0e58c61acef087d65f2047036.tar.xz
bench: basic block filter index initial sync
Introduce benchmark for the block filter index sync. And makes synchronous 'Sync()' mechanism accessible.
-rw-r--r--src/Makefile.bench.include1
-rw-r--r--src/bench/index_blockfilter.cpp43
-rw-r--r--src/index/base.cpp4
-rw-r--r--src/index/base.h16
4 files changed, 54 insertions, 10 deletions
diff --git a/src/Makefile.bench.include b/src/Makefile.bench.include
index 4d814bc5dc..7ba0111fa6 100644
--- a/src/Makefile.bench.include
+++ b/src/Makefile.bench.include
@@ -34,6 +34,7 @@ bench_bench_bitcoin_SOURCES = \
bench/examples.cpp \
bench/gcs_filter.cpp \
bench/hashpadding.cpp \
+ bench/index_blockfilter.cpp \
bench/load_external.cpp \
bench/lockedpool.cpp \
bench/logging.cpp \
diff --git a/src/bench/index_blockfilter.cpp b/src/bench/index_blockfilter.cpp
new file mode 100644
index 0000000000..5e0bfbfea6
--- /dev/null
+++ b/src/bench/index_blockfilter.cpp
@@ -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);
diff --git a/src/index/base.cpp b/src/index/base.cpp
index 036292cd8a..5953fe2150 100644
--- a/src/index/base.cpp
+++ b/src/index/base.cpp
@@ -141,7 +141,7 @@ static const CBlockIndex* NextSyncBlock(const CBlockIndex* pindex_prev, CChain&
return chain.Next(chain.FindFork(pindex_prev));
}
-void BaseIndex::ThreadSync()
+void BaseIndex::Sync()
{
const CBlockIndex* pindex = m_best_block_index.load();
if (!m_synced) {
@@ -394,7 +394,7 @@ bool BaseIndex::StartBackgroundSync()
{
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;
}
diff --git a/src/index/base.h b/src/index/base.h
index 154061fb19..0eb1d9ca3b 100644
--- a/src/index/base.h
+++ b/src/index/base.h
@@ -78,13 +78,6 @@ private:
std::thread m_thread_sync;
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.
///
/// Recommendations for error handling:
@@ -152,9 +145,16 @@ public:
/// validation interface so that it stays in sync with blockchain updates.
[[nodiscard]] bool Init();
- /// Starts the initial sync process.
+ /// Starts the initial sync process on a background thread.
[[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.
void Stop();