mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-11-10 22:18:54 +01:00
Merge bitcoin/bitcoin#28955: index: block filters sync, reduce disk read operations by caching last header
99afb9d15arefactor: init, simplify index shutdown code (furszy)0faafb57f8index: decrease ThreadSync cs_main contention (furszy)f1469eb454index: cache last block filter header (furszy)a6756ecdb2index: blockfilter, decouple header lookup into its own function (furszy)331f044e3bindex: blockfilter, decouple Write into its own function (furszy)bcbd7eb8d4bench: basic block filter index initial sync (furszy) Pull request description: Work decoupled from #26966 per request. The aim is to remove an unnecessary disk read operation that currently takes place with every new arriving block (or scanned block during background sync). Instead of reading the last filter header from disk merely to access its hash for constructing the next filter, this work caches it, occupying just 32 more bytes in memory. Also, reduces `cs_main` lock contention during the index initial sync process. And, simplifies the indexes initialization and shutdown procedure. Testing Note: To compare the changes, added a pretty basic benchmark in the second commit. Alternatively, could also test the changes by timing the block filter sync from scratch on any network; start the node with `-blockfilterindex` and monitor the logs until the syncing process finish. Local Benchmark Results: *Master (c252a0fc0f): | ns/op | op/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- | 132,042,516.60 | 7.57 | 0.3% | 7.79 | `BlockFilterIndexSync` *PR (43a212cfdac6c64e82b601c664443d022f191520): | ns/op | op/s | err% | total | benchmark |--------------------:|--------------------:|--------:|----------:|:---------- | 126,915,841.60 | 7.88 | 0.6% | 7.51 | `BlockFilterIndexSync` ACKs for top commit: Sjors: re-ACK99afb9d15aachow101: ACK99afb9d15aTheCharlatan: Re-ACK99afb9d15aandrewtoth: ACK99afb9d15aTree-SHA512: 927daadd68f4ee1ca781a89519539b895f5185a76ebaf525fbc246ea8dcf40d44a82def00ac34b188640802844b312270067f1b33e65a2479e06be9169c616de
This commit is contained in:
21
src/init.cpp
21
src/init.cpp
@@ -256,12 +256,8 @@ void Interrupt(NodeContext& node)
|
||||
InterruptMapPort();
|
||||
if (node.connman)
|
||||
node.connman->Interrupt();
|
||||
if (g_txindex) {
|
||||
g_txindex->Interrupt();
|
||||
}
|
||||
ForEachBlockFilterIndex([](BlockFilterIndex& index) { index.Interrupt(); });
|
||||
if (g_coin_stats_index) {
|
||||
g_coin_stats_index->Interrupt();
|
||||
for (auto* index : node.indexes) {
|
||||
index->Interrupt();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -337,16 +333,11 @@ void Shutdown(NodeContext& node)
|
||||
if (node.validation_signals) node.validation_signals->FlushBackgroundCallbacks();
|
||||
|
||||
// Stop and delete all indexes only after flushing background callbacks.
|
||||
if (g_txindex) {
|
||||
g_txindex->Stop();
|
||||
g_txindex.reset();
|
||||
}
|
||||
if (g_coin_stats_index) {
|
||||
g_coin_stats_index->Stop();
|
||||
g_coin_stats_index.reset();
|
||||
}
|
||||
ForEachBlockFilterIndex([](BlockFilterIndex& index) { index.Stop(); });
|
||||
for (auto* index : node.indexes) index->Stop();
|
||||
if (g_txindex) g_txindex.reset();
|
||||
if (g_coin_stats_index) g_coin_stats_index.reset();
|
||||
DestroyAllBlockFilterIndexes();
|
||||
node.indexes.clear(); // all instances are nullptr now
|
||||
|
||||
// Any future callbacks will be dropped. This should absolutely be safe - if
|
||||
// missing a callback results in an unrecoverable situation, unclean shutdown
|
||||
|
||||
Reference in New Issue
Block a user