aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFabian Jahr <fjahr@protonmail.com>2021-04-18 16:48:52 +0200
committerFabian Jahr <fjahr@protonmail.com>2022-04-25 23:18:01 +0200
commit231fc7b035481f748159968353c1cab81354e843 (patch)
tree4b04c9911342bd54b070a567c9eda6dec9a1efc0
parent1e7db37e76c510d373c4404eea2b97508b367aca (diff)
downloadbitcoin-231fc7b035481f748159968353c1cab81354e843.tar.xz
refactor: Introduce GetFirstStoredBlock helper function
-rw-r--r--src/index/base.cpp6
-rw-r--r--src/node/blockstorage.cpp10
-rw-r--r--src/node/blockstorage.h3
-rw-r--r--src/rpc/blockchain.cpp13
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};