mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-06-03 17:54:19 +02:00
refactor: index, decouple 'Init' from 'Start'
So indexes can be initialized without spawning the sync thread. This makes asynchronous indexes startup possible in the following commits.
This commit is contained in:
@@ -81,6 +81,13 @@ BaseIndex::~BaseIndex()
|
||||
|
||||
bool BaseIndex::Init()
|
||||
{
|
||||
// m_chainstate member gives indexing code access to node internals. It is
|
||||
// removed in followup https://github.com/bitcoin/bitcoin/pull/24230
|
||||
m_chainstate = &m_chain->context()->chainman->ActiveChainstate();
|
||||
// Register to validation interface before setting the 'm_synced' flag, so that
|
||||
// callbacks are not missed once m_synced is true.
|
||||
RegisterValidationInterface(this);
|
||||
|
||||
CBlockLocator locator;
|
||||
if (!GetDB().ReadBestBlock(locator)) {
|
||||
locator.SetNull();
|
||||
@@ -147,6 +154,7 @@ bool BaseIndex::Init()
|
||||
// datadir and an index enabled. If this is the case, indexation will happen solely
|
||||
// via `BlockConnected` signals until, possibly, the next restart.
|
||||
m_synced = synced;
|
||||
m_init = true;
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -401,15 +409,9 @@ void BaseIndex::Interrupt()
|
||||
m_interrupt();
|
||||
}
|
||||
|
||||
bool BaseIndex::Start()
|
||||
bool BaseIndex::StartBackgroundSync()
|
||||
{
|
||||
// m_chainstate member gives indexing code access to node internals. It is
|
||||
// removed in followup https://github.com/bitcoin/bitcoin/pull/24230
|
||||
m_chainstate = &m_chain->context()->chainman->ActiveChainstate();
|
||||
// Need to register this ValidationInterface before running Init(), so that
|
||||
// callbacks are not missed if Init sets m_synced to true.
|
||||
RegisterValidationInterface(this);
|
||||
if (!Init()) return false;
|
||||
if (!m_init) throw std::logic_error("Error: Cannot start a non-initialized index");
|
||||
|
||||
m_thread_sync = std::thread(&util::TraceThread, GetName(), [this] { ThreadSync(); });
|
||||
return true;
|
||||
|
||||
@@ -54,6 +54,8 @@ protected:
|
||||
};
|
||||
|
||||
private:
|
||||
/// Whether the index has been initialized or not.
|
||||
std::atomic<bool> m_init{false};
|
||||
/// Whether the index is in sync with the main chain. The flag is flipped
|
||||
/// from false to true once, after which point this starts processing
|
||||
/// ValidationInterface notifications to stay in sync.
|
||||
@@ -69,9 +71,6 @@ private:
|
||||
std::thread m_thread_sync;
|
||||
CThreadInterrupt m_interrupt;
|
||||
|
||||
/// Read best block locator and check that data needed to sync has not been pruned.
|
||||
bool Init();
|
||||
|
||||
/// 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
|
||||
@@ -142,9 +141,12 @@ public:
|
||||
|
||||
void Interrupt();
|
||||
|
||||
/// Start initializes the sync state and registers the instance as a
|
||||
/// ValidationInterface so that it stays in sync with blockchain updates.
|
||||
[[nodiscard]] bool Start();
|
||||
/// Initializes the sync state and registers the instance to the
|
||||
/// validation interface so that it stays in sync with blockchain updates.
|
||||
[[nodiscard]] bool Init();
|
||||
|
||||
/// Starts the initial sync process.
|
||||
[[nodiscard]] bool StartBackgroundSync();
|
||||
|
||||
/// Stops the instance from staying in sync with blockchain updates.
|
||||
void Stop();
|
||||
|
||||
Reference in New Issue
Block a user