mirror of
https://github.com/ElementsProject/elements.git
synced 2026-08-15 12:51:00 +02:00
make GetFirstStoredBlock assert that 'start_block' always has data
And transfer the responsibility of verifying whether 'start_block' has data or not to the caller. This is because the 'GetFirstStoredBlock' function responsibility is to return the first block containing data. And the current implementation can return 'start_block' when it has no data!. Which is misleading at least. Edge case behavior change: Previously, if the block tip lacked data but all preceding blocks contained data, there was no prune violation. And now, such scenario will result in a prune violation.
This commit is contained in:
parent
430e7027a1
commit
c82ef91eae
5 changed files with 40 additions and 6 deletions
|
|
@ -407,6 +407,7 @@ const CBlockIndex* BlockManager::GetFirstStoredBlock(const CBlockIndex& start_bl
|
|||
{
|
||||
AssertLockHeld(::cs_main);
|
||||
const CBlockIndex* last_block = &start_block;
|
||||
assert(last_block->nStatus & BLOCK_HAVE_DATA);
|
||||
while (last_block->pprev && (last_block->pprev->nStatus & BLOCK_HAVE_DATA)) {
|
||||
last_block = last_block->pprev;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -222,7 +222,9 @@ public:
|
|||
//! Returns last CBlockIndex* that is a checkpoint
|
||||
const CBlockIndex* GetLastCheckpoint(const CCheckpointData& data) EXCLUSIVE_LOCKS_REQUIRED(cs_main);
|
||||
|
||||
//! Find the first block that is not pruned
|
||||
//! Find the first stored ancestor of start_block immediately after the last
|
||||
//! pruned ancestor. Return value will never be null. Caller is responsible
|
||||
//! for ensuring that start_block has data is not pruned.
|
||||
const CBlockIndex* GetFirstStoredBlock(const CBlockIndex& start_block LIFETIMEBOUND) EXCLUSIVE_LOCKS_REQUIRED(::cs_main);
|
||||
|
||||
/** True if any block files have ever been pruned. */
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue