diff --git a/src/init.cpp b/src/init.cpp index 80205df000f..7d44ccc17f2 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(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(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 4dcf3fc51ee..a050a76b3cc 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 91b68fa5bbf..dae900ff7f3 100644 --- a/src/node/context.h +++ b/src/node/context.h @@ -15,8 +15,9 @@ #include 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 chainman; std::unique_ptr banman; ArgsManager* args{nullptr}; // Currently a raw pointer because the memory is not managed by this struct + std::vector indexes; // raw pointers because memory is not managed by this struct std::unique_ptr chain; //! List of all chain clients (wallet processes or other client) connected to node. std::vector> chain_clients;