aboutsummaryrefslogtreecommitdiff
path: root/src/node/blockstorage.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/node/blockstorage.cpp')
-rw-r--r--src/node/blockstorage.cpp20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/node/blockstorage.cpp b/src/node/blockstorage.cpp
index cd057dd708..e3c6b062b2 100644
--- a/src/node/blockstorage.cpp
+++ b/src/node/blockstorage.cpp
@@ -403,17 +403,31 @@ bool BlockManager::IsBlockPruned(const CBlockIndex* pblockindex)
return (m_have_pruned && !(pblockindex->nStatus & BLOCK_HAVE_DATA) && pblockindex->nTx > 0);
}
-const CBlockIndex* BlockManager::GetFirstStoredBlock(const CBlockIndex& start_block)
+const CBlockIndex* BlockManager::GetFirstStoredBlock(const CBlockIndex& upper_block, const CBlockIndex* lower_block)
{
AssertLockHeld(::cs_main);
- const CBlockIndex* last_block = &start_block;
- assert(last_block->nStatus & BLOCK_HAVE_DATA);
+ const CBlockIndex* last_block = &upper_block;
+ assert(last_block->nStatus & BLOCK_HAVE_DATA); // 'upper_block' must have data
while (last_block->pprev && (last_block->pprev->nStatus & BLOCK_HAVE_DATA)) {
+ if (lower_block) {
+ // Return if we reached the lower_block
+ if (last_block == lower_block) return lower_block;
+ // if range was surpassed, means that 'lower_block' is not part of the 'upper_block' chain
+ // and so far this is not allowed.
+ assert(last_block->nHeight >= lower_block->nHeight);
+ }
last_block = last_block->pprev;
}
+ assert(last_block != nullptr);
return last_block;
}
+bool BlockManager::CheckBlockDataAvailability(const CBlockIndex& upper_block, const CBlockIndex& lower_block)
+{
+ if (!(upper_block.nStatus & BLOCK_HAVE_DATA)) return false;
+ return GetFirstStoredBlock(upper_block, &lower_block) == &lower_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