diff options
author | James O'Beirne <james.obeirne@gmail.com> | 2019-12-12 10:28:14 -0500 |
---|---|---|
committer | James O'Beirne <james.obeirne@pm.me> | 2020-03-17 14:03:40 -0400 |
commit | 5b690f0aae21e7d46cbefe3f5be645842ac4ae3b (patch) | |
tree | f400ff724c4d23acaff44dd9820854e00cbdafdb | |
parent | 89cdf4d5692d396b8c7177b3918aa9dab07f9624 (diff) |
refactor: move RewindBlockIndex to CChainState
This is in preparation for multiple chainstate initialization in init.
-rw-r--r-- | src/init.cpp | 2 | ||||
-rw-r--r-- | src/validation.cpp | 27 | ||||
-rw-r--r-- | src/validation.h | 3 |
3 files changed, 9 insertions, 23 deletions
diff --git a/src/init.cpp b/src/init.cpp index 97640b0658..765c61b3db 100644 --- a/src/init.cpp +++ b/src/init.cpp @@ -1614,7 +1614,7 @@ bool AppInitMain(NodeContext& node) // It both disconnects blocks based on ::ChainActive(), and drops block data in // BlockIndex() based on lack of available witness data. uiInterface.InitMessage(_("Rewinding blocks...").translated); - if (!RewindBlockIndex(chainparams)) { + if (!::ChainstateActive().RewindBlockIndex(chainparams)) { strLoadError = _("Unable to rewind the database to a pre-fork state. You will need to redownload the blockchain").translated; break; } diff --git a/src/validation.cpp b/src/validation.cpp index a6b1344792..9d4cdf6eb9 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -4538,26 +4538,15 @@ bool CChainState::RewindBlockIndex(const CChainParams& params) PruneBlockIndexCandidates(); CheckBlockIndex(params.GetConsensus()); - } - } - - return true; -} - -bool RewindBlockIndex(const CChainParams& params) { - if (!::ChainstateActive().RewindBlockIndex(params)) { - return false; - } - LOCK(cs_main); - if (::ChainActive().Tip() != nullptr) { - // 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. - BlockValidationState state; - if (!::ChainstateActive().FlushStateToDisk(params, state, FlushStateMode::ALWAYS)) { - LogPrintf("RewindBlockIndex: unable to flush state to disk (%s)\n", state.ToString()); - 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. + BlockValidationState state; + if (!FlushStateToDisk(params, state, FlushStateMode::ALWAYS)) { + LogPrintf("RewindBlockIndex: unable to flush state to disk (%s)\n", state.ToString()); + return false; + } } } diff --git a/src/validation.h b/src/validation.h index 35e4380bc0..3b160ac799 100644 --- a/src/validation.h +++ b/src/validation.h @@ -380,9 +380,6 @@ bool TestBlockValidity(BlockValidationState& state, const CChainParams& chainpar * Note that transaction witness validation rules are always enforced when P2SH is enforced. */ bool IsWitnessEnabled(const CBlockIndex* pindexPrev, const Consensus::Params& params); -/** When there are blocks in the active chain with missing data, rewind the chainstate and remove them from the block index */ -bool RewindBlockIndex(const CChainParams& params) LOCKS_EXCLUDED(cs_main); - /** Compute at which vout of the block's coinbase transaction the witness commitment occurs, or -1 if not found */ int GetWitnessCommitmentIndex(const CBlock& block); |