diff options
| author | Matt Corallo <[email protected]> | 2017-07-06 21:29:46 -0400 |
|---|---|---|
| committer | Matt Corallo <[email protected]> | 2017-07-27 15:03:05 -0400 |
| commit | ff3a21919d97f7500978b4160199336e4b50b36a (patch) | |
| tree | db20d70619278213b27694968fd6afd693334f93 /src/validation.cpp | |
| parent | More user-friendly error message if UTXO DB runs ahead of block DB (diff) | |
| download | discoin-ff3a21919d97f7500978b4160199336e4b50b36a.tar.xz discoin-ff3a21919d97f7500978b4160199336e4b50b36a.zip | |
Call RewindBlockIndex even if we're about to run -reindex-chainstate
RewindBlockIndex works over both chainActive - disconnecting blocks
from the tip that need witness verification - and mapBlockIndex -
requiring redownload of blocks missing witness data.
It should never have been the case that the second half is skipped
if we're about to run -reindex-chainstate.
Diffstat (limited to 'src/validation.cpp')
| -rw-r--r-- | src/validation.cpp | 17 |
1 files changed, 13 insertions, 4 deletions
diff --git a/src/validation.cpp b/src/validation.cpp index 91982ead9..7ec77406e 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3763,6 +3763,8 @@ bool RewindBlockIndex(const CChainParams& params) { LOCK(cs_main); + // Note that during -reindex-chainstate we are called with an empty chainActive! + int nHeight = 1; while (nHeight <= chainActive.Height()) { if (IsWitnessEnabled(chainActive[nHeight - 1], params.GetConsensus()) && !(chainActive[nHeight]->nStatus & BLOCK_OPT_WITNESS)) { @@ -3832,12 +3834,19 @@ bool RewindBlockIndex(const CChainParams& params) } } - PruneBlockIndexCandidates(); + if (chainActive.Tip() != NULL) { + // We can't prune block index candidates based on our tip if we have + // no tip due to chainActive being empty! + PruneBlockIndexCandidates(); - CheckBlockIndex(params.GetConsensus()); + CheckBlockIndex(params.GetConsensus()); - if (!FlushStateToDisk(params, state, FLUSH_STATE_ALWAYS)) { - return false; + // FlushStateToDisk can possibly read chainActive. Be conservative + // and skip it here, we're about to -reindex-chainstate anyway, so + // it'll get called a bunch real soon. + if (!FlushStateToDisk(params, state, FLUSH_STATE_ALWAYS)) { + return false; + } } return true; |