mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-06-08 14:10:16 +02:00
index: race fix, lock cs_main while 'm_synced' is subject to change
This ensures that the index does not miss any 'new block' signals occurring in-between reading the 'next block' and setting 'm_synced'. Because, if this were to happen, the ignored blocks would never be indexed, thus stalling the index forever.
This commit is contained in:
parent
3f6a6da3b0
commit
65951e0418
@ -160,13 +160,25 @@ void BaseIndex::Sync()
|
|||||||
}
|
}
|
||||||
|
|
||||||
const CBlockIndex* pindex_next = WITH_LOCK(cs_main, return NextSyncBlock(pindex, m_chainstate->m_chain));
|
const CBlockIndex* pindex_next = WITH_LOCK(cs_main, return NextSyncBlock(pindex, m_chainstate->m_chain));
|
||||||
|
// If pindex_next is null, it means pindex is the chain tip, so
|
||||||
|
// commit data indexed so far.
|
||||||
if (!pindex_next) {
|
if (!pindex_next) {
|
||||||
SetBestBlockIndex(pindex);
|
SetBestBlockIndex(pindex);
|
||||||
// No need to handle errors in Commit. See rationale above.
|
// No need to handle errors in Commit. See rationale above.
|
||||||
Commit();
|
Commit();
|
||||||
|
|
||||||
|
// If pindex is still the chain tip after committing, exit the
|
||||||
|
// sync loop. It is important for cs_main to be locked while
|
||||||
|
// setting m_synced = true, otherwise a new block could be
|
||||||
|
// attached while m_synced is still false, and it would not be
|
||||||
|
// indexed.
|
||||||
|
LOCK(::cs_main);
|
||||||
|
pindex_next = NextSyncBlock(pindex, m_chainstate->m_chain);
|
||||||
|
if (!pindex_next) {
|
||||||
m_synced = true;
|
m_synced = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
if (pindex_next->pprev != pindex && !Rewind(pindex, pindex_next->pprev)) {
|
if (pindex_next->pprev != pindex && !Rewind(pindex, pindex_next->pprev)) {
|
||||||
FatalErrorf("%s: Failed to rewind index %s to a previous chain tip", __func__, GetName());
|
FatalErrorf("%s: Failed to rewind index %s to a previous chain tip", __func__, GetName());
|
||||||
return;
|
return;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user