Since commit f08c9fb0c6a799e3cb75ca5f763a746471625beb from PR #21726, index BlockUntilSyncedToCurrentChain
behavior has been less reliable, and there has also been a race condition in the coinstatsindex_initial_sync
unit test.
It seems better for BlockUntilSyncedToCurrentChain
to actually wait for the last connected block to be fully processed, than to be able to return before prune locks are set, so this switches the order of m_best_block_index = block;
and UpdatePruneLock
statements in SetBestBlockIndex
to make it more reliable.
Also since commit f08c9fb0c6a799e3cb75ca5f763a746471625beb, there has been a race condition in the coinstatsindex_initial_sync
test. Before that commit, the atomic index best block pointer m_best_block_index
was updated as the last step of BaseIndex::BlockConnected
, so BlockUntilSyncedToCurrentChain
could safely be used in tests to wait for the last BlockConnected
notification to be finished before stopping and destroying the index. But after that commit, calling BlockUntilSyncedToCurrentChain
is no longer sufficient, and there is a race between the test shutdown code which destroys the index object and the new code introduced in that commit calling AllowPrune()
and GetName()
on the index object. Reproducibility instructions for this are in #25365 (comment)
This commit fixes the coinstatsindex_initial_sync
race condition, even though it will require an additional change to silence TSAN false positives, #26188, after it is fixed. So this partially addresses but does not resolve the bug reporting TSAN errors #25365.
There is no known race condition outside of test code currently, because the bitcoind Shutdown
function calls FlushBackgroundCallbacks
not BlockUntilSyncedToCurrentChain
to safely shut down.
Co-authored-by: vasild Co-authored-by: MarcoFalke