aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorfurszy <matiasfurszyfer@protonmail.com>2023-06-16 10:16:22 -0300
committerfurszy <matiasfurszyfer@protonmail.com>2023-07-07 19:31:27 -0300
commit225e213110602b4fd1d345167f5f92d26557f6c1 (patch)
tree7f5e352803344f9d6a43347cfc6fe225a474e04a
parent2ebc7e68cc9d347807b646f601b27940c9590c89 (diff)
downloadbitcoin-225e213110602b4fd1d345167f5f92d26557f6c1.tar.xz
refactor: init indexes, decouple 'Start()' from the creation step
No behavior change. The goal here is to group indexes, so we can perform the same initialization and verification process equally for all of them. The checks performed inside `StartIndexes` will be expanded in the subsequent commits.
-rw-r--r--src/init.cpp21
-rw-r--r--src/init.h3
-rw-r--r--src/node/context.h4
3 files changed, 18 insertions, 10 deletions
diff --git a/src/init.cpp b/src/init.cpp
index 80205df000..7d44ccc17f 100644
--- a/src/init.cpp
+++ b/src/init.cpp
@@ -1554,25 +1554,22 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
}
g_txindex = std::make_unique<TxIndex>(interfaces::MakeChain(node), cache_sizes.tx_index, false, fReindex);
- if (!g_txindex->Start()) {
- return false;
- }
+ node.indexes.emplace_back(g_txindex.get());
}
for (const auto& filter_type : g_enabled_filter_types) {
InitBlockFilterIndex([&]{ return interfaces::MakeChain(node); }, filter_type, cache_sizes.filter_index, false, fReindex);
- if (!GetBlockFilterIndex(filter_type)->Start()) {
- return false;
- }
+ node.indexes.emplace_back(GetBlockFilterIndex(filter_type));
}
if (args.GetBoolArg("-coinstatsindex", DEFAULT_COINSTATSINDEX)) {
g_coin_stats_index = std::make_unique<CoinStatsIndex>(interfaces::MakeChain(node), /*cache_size=*/0, false, fReindex);
- if (!g_coin_stats_index->Start()) {
- return false;
- }
+ node.indexes.emplace_back(g_coin_stats_index.get());
}
+ // Now that all indexes are loaded, start them
+ StartIndexes(node);
+
// ********************************************************* Step 9: load wallet
for (const auto& client : node.chain_clients) {
if (!client->load()) {
@@ -1878,3 +1875,9 @@ bool AppInitMain(NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip_info)
return true;
}
+
+bool StartIndexes(NodeContext& node)
+{
+ for (auto index : node.indexes) if (!index->Start()) return false;
+ return true;
+}
diff --git a/src/init.h b/src/init.h
index 4dcf3fc51e..a050a76b3c 100644
--- a/src/init.h
+++ b/src/init.h
@@ -73,4 +73,7 @@ bool AppInitMain(node::NodeContext& node, interfaces::BlockAndHeaderTipInfo* tip
*/
void SetupServerArgs(ArgsManager& argsman);
+/** Validates requirements to run the indexes and spawns each index initial sync thread */
+bool StartIndexes(node::NodeContext& node);
+
#endif // BITCOIN_INIT_H
diff --git a/src/node/context.h b/src/node/context.h
index 91b68fa5bb..dae900ff7f 100644
--- a/src/node/context.h
+++ b/src/node/context.h
@@ -15,8 +15,9 @@
#include <vector>
class ArgsManager;
-class BanMan;
class AddrMan;
+class BanMan;
+class BaseIndex;
class CBlockPolicyEstimator;
class CConnman;
class CScheduler;
@@ -58,6 +59,7 @@ struct NodeContext {
std::unique_ptr<ChainstateManager> chainman;
std::unique_ptr<BanMan> banman;
ArgsManager* args{nullptr}; // Currently a raw pointer because the memory is not managed by this struct
+ std::vector<BaseIndex*> indexes; // raw pointers because memory is not managed by this struct
std::unique_ptr<interfaces::Chain> chain;
//! List of all chain clients (wallet processes or other client) connected to node.
std::vector<std::unique_ptr<interfaces::ChainClient>> chain_clients;