Skip to content

Commit

Permalink
Fix fast-shutdown crash if genesis block was not loaded
Browse files Browse the repository at this point in the history
If the ShutdownRequested() check at the top of ActivateBestChain()
returns false during initial genesis block load we will fail an
assertion in UTXO DB flush as the best block hash IsNull(). To work
around this, we move the check until after one round of
ActivateBestChainStep(), ensuring the genesis block gets connected.
  • Loading branch information
TheBlueMatt committed Feb 6, 2018
1 parent 1c9394a commit dd2de47
Showing 1 changed file with 7 additions and 3 deletions.
10 changes: 7 additions & 3 deletions src/validation.cpp
Expand Up @@ -2581,9 +2581,6 @@ bool CChainState::ActivateBestChain(CValidationState &state, const CChainParams&
SyncWithValidationInterfaceQueue();
}

if (ShutdownRequested())
break;

const CBlockIndex *pindexFork;
bool fInitialDownload;
{
Expand Down Expand Up @@ -2630,6 +2627,13 @@ bool CChainState::ActivateBestChain(CValidationState &state, const CChainParams&
}

if (nStopAtHeight && pindexNewTip && pindexNewTip->nHeight >= nStopAtHeight) StartShutdown();

// We check shutdown only after giving ActivateBestChainStep a chance to run once so that we
// never shutdown before connecting the genesis block during LoadChainTip(). Previously this
// caused an assert() failure during shutdown in such cases as the UTXO DB flushing checks
// that the best block hash is non-null.
if (ShutdownRequested())
break;
} while (pindexNewTip != pindexMostWork);
CheckBlockIndex(chainparams.GetConsensus());

Expand Down

0 comments on commit dd2de47

Please sign in to comment.