diff options
author | Fabian Jahr <fjahr@protonmail.com> | 2021-04-18 16:48:52 +0200 |
---|---|---|
committer | Fabian Jahr <fjahr@protonmail.com> | 2022-04-25 23:18:01 +0200 |
commit | 231fc7b035481f748159968353c1cab81354e843 (patch) | |
tree | 4b04c9911342bd54b070a567c9eda6dec9a1efc0 | |
parent | 1e7db37e76c510d373c4404eea2b97508b367aca (diff) |
refactor: Introduce GetFirstStoredBlock helper function
-rw-r--r-- | src/index/base.cpp | 6 | ||||
-rw-r--r-- | src/node/blockstorage.cpp | 10 | ||||
-rw-r--r-- | src/node/blockstorage.h | 3 | ||||
-rw-r--r-- | src/rpc/blockchain.cpp | 13 |
4 files changed, 18 insertions, 14 deletions
diff --git a/src/index/base.cpp b/src/index/base.cpp index 8fe30f8960..9f60d331c6 100644 --- a/src/index/base.cpp +++ b/src/index/base.cpp @@ -75,11 +75,7 @@ bool BaseIndex::Init() if (!m_best_block_index) { // index is not built yet // make sure we have all block data back to the genesis - const CBlockIndex* block = active_chain.Tip(); - while (block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA)) { - block = block->pprev; - } - prune_violation = block != active_chain.Genesis(); + prune_violation = node::GetFirstStoredBlock(active_chain.Tip()) != active_chain.Genesis(); } // in case the index has a best block set and is not fully synced // check if we have the required blocks to continue building the index diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp index 21cb0250d8..c3f42fde2d 100644 --- a/src/node/blockstorage.cpp +++ b/src/node/blockstorage.cpp @@ -397,6 +397,16 @@ bool BlockManager::IsBlockPruned(const CBlockIndex* pblockindex) return (m_have_pruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0); } +const CBlockIndex* GetFirstStoredBlock(const CBlockIndex* start_block) { + AssertLockHeld(::cs_main); + assert(start_block); + const CBlockIndex* last_block = start_block; + while (last_block->pprev && (last_block->pprev->nStatus & BLOCK_HAVE_DATA)) { + last_block = last_block->pprev; + } + return last_block; +} + // If we're using -prune with -reindex, then delete block files that will be ignored by the // reindex. Since reindexing works by starting at block file 0 and looping until a blockfile // is missing, do the same here to delete any later block files after a gap. Also delete all diff --git a/src/node/blockstorage.h b/src/node/blockstorage.h index 11445aa22e..229c099f1f 100644 --- a/src/node/blockstorage.h +++ b/src/node/blockstorage.h @@ -181,6 +181,9 @@ public: } }; +//! Find the first block that is not pruned +const CBlockIndex* GetFirstStoredBlock(const CBlockIndex* start_block) EXCLUSIVE_LOCKS_REQUIRED(::cs_main); + void CleanupBlockRevFiles(); /** Open a block file (blk?????.dat) */ diff --git a/src/rpc/blockchain.cpp b/src/rpc/blockchain.cpp index d6a6bd5f31..f1ad143e0f 100644 --- a/src/rpc/blockchain.cpp +++ b/src/rpc/blockchain.cpp @@ -787,10 +787,9 @@ static RPCHelpMan pruneblockchain() PruneBlockFilesManual(active_chainstate, height); const CBlockIndex* block = CHECK_NONFATAL(active_chain.Tip()); - while (block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA)) { - block = block->pprev; - } - return uint64_t(block->nHeight); + const CBlockIndex* last_block = node::GetFirstStoredBlock(block); + + return static_cast<uint64_t>(last_block->nHeight); }, }; } @@ -1217,11 +1216,7 @@ RPCHelpMan getblockchaininfo() obj.pushKV("pruned", node::fPruneMode); if (node::fPruneMode) { const CBlockIndex* block = CHECK_NONFATAL(tip); - while (block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA)) { - block = block->pprev; - } - - obj.pushKV("pruneheight", block->nHeight); + obj.pushKV("pruneheight", node::GetFirstStoredBlock(block)->nHeight); // if 0, execution bypasses the whole if block. bool automatic_pruning{args.GetIntArg("-prune", 0) != 1}; |