From 4ed55dfcd7894fd5ba6395f244a17ab1f8e786d4 Mon Sep 17 00:00:00 2001 From: James O'Beirne Date: Mon, 24 Jun 2019 15:22:33 -0400 Subject: [PATCH] refactoring: add block_index_candidates arg to LoadBlockIndex Prevents BlockManager from having to reference ChainstateActive() within one of its methods which improves encapsulation and makes testing easier. --- src/validation.cpp | 13 +++++++++---- src/validation.h | 12 +++++++++++- 2 files changed, 20 insertions(+), 5 deletions(-) diff --git a/src/validation.cpp b/src/validation.cpp index 75d5bb9fe..3e71928d1 100644 --- a/src/validation.cpp +++ b/src/validation.cpp @@ -3705,7 +3705,10 @@ CBlockIndex * BlockManager::InsertBlockIndex(const uint256& hash) return pindexNew; } -bool BlockManager::LoadBlockIndex(const Consensus::Params& consensus_params, CBlockTreeDB& blocktree) +bool BlockManager::LoadBlockIndex( + const Consensus::Params& consensus_params, + CBlockTreeDB& blocktree, + std::set& block_index_candidates) { if (!blocktree.LoadBlockIndexGuts(consensus_params, [this](const uint256& hash) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { return this->InsertBlockIndex(hash); })) return false; @@ -3743,8 +3746,9 @@ bool BlockManager::LoadBlockIndex(const Consensus::Params& consensus_params, CBl pindex->nStatus |= BLOCK_FAILED_CHILD; setDirtyBlockIndex.insert(pindex); } - if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->HaveTxsDownloaded() || pindex->pprev == nullptr)) - ::ChainstateActive().setBlockIndexCandidates.insert(pindex); + if (pindex->IsValid(BLOCK_VALID_TRANSACTIONS) && (pindex->HaveTxsDownloaded() || pindex->pprev == nullptr)) { + block_index_candidates.insert(pindex); + } if (pindex->nStatus & BLOCK_FAILED_MASK && (!pindexBestInvalid || pindex->nChainWork > pindexBestInvalid->nChainWork)) pindexBestInvalid = pindex; if (pindex->pprev) @@ -3769,7 +3773,8 @@ void BlockManager::Unload() { bool static LoadBlockIndexDB(const CChainParams& chainparams) EXCLUSIVE_LOCKS_REQUIRED(cs_main) { - if (!g_blockman.LoadBlockIndex(chainparams.GetConsensus(), *pblocktree)) + if (!g_blockman.LoadBlockIndex( + chainparams.GetConsensus(), *pblocktree, ::ChainstateActive().setBlockIndexCandidates)) return false; // Load block file info diff --git a/src/validation.h b/src/validation.h index 09afbf7b1..ab18f662a 100644 --- a/src/validation.h +++ b/src/validation.h @@ -475,9 +475,19 @@ public: */ std::multimap m_blocks_unlinked; + /** + * Load the blocktree off disk and into memory. Populate certain metadata + * per index entry (nStatus, nChainWork, nTimeMax, etc.) as well as peripheral + * collections like setDirtyBlockIndex. + * + * @param[out] block_index_candidates Fill this set with any valid blocks for + * which we've downloaded all transactions. + */ bool LoadBlockIndex( const Consensus::Params& consensus_params, - CBlockTreeDB& blocktree) EXCLUSIVE_LOCKS_REQUIRED(cs_main); + CBlockTreeDB& blocktree, + std::set& block_index_candidates) + EXCLUSIVE_LOCKS_REQUIRED(cs_main); /** Clear all data members. */ void Unload() EXCLUSIVE_LOCKS_REQUIRED(cs_main);