0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-15 11:36:00 -05:00

Bugfix: RPC/blockchain: pruneblockchain: Return the height of the actual last pruned block

From 0.14 (2017 Mar) until before 0.19 (2019 Nov), the height of the last
block pruned was returned, subject to a bug if there were blocks left unpruned
due to sharing files with later blocks.

In #15991, this was "fixed" to the current implementation, introducing a new
bug: now, it returns the first *unpruned* block.

Since the user provides the parameter as a block to include in pruning, it
makes more sense to fix the behaviour to match the documentation.
This commit is contained in:
Luke Dashjr 2022-03-21 18:38:54 +00:00
parent 2cf8c2caea
commit e593ae07c4
3 changed files with 5 additions and 5 deletions

View file

@ -790,7 +790,7 @@ static RPCHelpMan pruneblockchain()
const CBlockIndex& block{*CHECK_NONFATAL(active_chain.Tip())}; const CBlockIndex& block{*CHECK_NONFATAL(active_chain.Tip())};
const CBlockIndex* last_block{active_chainstate.m_blockman.GetFirstStoredBlock(block)}; const CBlockIndex* last_block{active_chainstate.m_blockman.GetFirstStoredBlock(block)};
return static_cast<uint64_t>(last_block->nHeight); return static_cast<int64_t>(last_block->nHeight - 1);
}, },
}; };
} }

View file

@ -73,7 +73,7 @@ class FeatureIndexPruneTest(BitcoinTestFramework):
pruneheight_new = node.pruneblockchain(400) pruneheight_new = node.pruneblockchain(400)
# the prune heights used here and below are magic numbers that are determined by the # the prune heights used here and below are magic numbers that are determined by the
# thresholds at which block files wrap, so they depend on disk serialization and default block file size. # thresholds at which block files wrap, so they depend on disk serialization and default block file size.
assert_equal(pruneheight_new, 249) assert_equal(pruneheight_new, 248)
self.log.info("check if we can access the tips blockfilter and coinstats when we have pruned some blocks") self.log.info("check if we can access the tips blockfilter and coinstats when we have pruned some blocks")
tip = self.nodes[0].getbestblockhash() tip = self.nodes[0].getbestblockhash()
@ -108,7 +108,7 @@ class FeatureIndexPruneTest(BitcoinTestFramework):
self.log.info("prune exactly up to the indices best blocks while the indices are disabled") self.log.info("prune exactly up to the indices best blocks while the indices are disabled")
for i in range(3): for i in range(3):
pruneheight_2 = self.nodes[i].pruneblockchain(1000) pruneheight_2 = self.nodes[i].pruneblockchain(1000)
assert_equal(pruneheight_2, 751) assert_equal(pruneheight_2, 750)
# Restart the nodes again with the indices activated # Restart the nodes again with the indices activated
self.restart_node(i, extra_args=self.extra_args[i]) self.restart_node(i, extra_args=self.extra_args[i])
@ -142,7 +142,7 @@ class FeatureIndexPruneTest(BitcoinTestFramework):
for node in self.nodes[:2]: for node in self.nodes[:2]:
with node.assert_debug_log(['limited pruning to height 2489']): with node.assert_debug_log(['limited pruning to height 2489']):
pruneheight_new = node.pruneblockchain(2500) pruneheight_new = node.pruneblockchain(2500)
assert_equal(pruneheight_new, 2006) assert_equal(pruneheight_new, 2005)
self.log.info("ensure that prune locks don't prevent indices from failing in a reorg scenario") self.log.info("ensure that prune locks don't prevent indices from failing in a reorg scenario")
with self.nodes[0].assert_debug_log(['basic block filter index prune lock moved back to 2480']): with self.nodes[0].assert_debug_log(['basic block filter index prune lock moved back to 2480']):

View file

@ -291,7 +291,7 @@ class PruneTest(BitcoinTestFramework):
def prune(index): def prune(index):
ret = node.pruneblockchain(height=height(index)) ret = node.pruneblockchain(height=height(index))
assert_equal(ret, node.getblockchaininfo()['pruneheight']) assert_equal(ret + 1, node.getblockchaininfo()['pruneheight'])
def has_block(index): def has_block(index):
return os.path.isfile(os.path.join(self.nodes[node_number].datadir, self.chain, "blocks", f"blk{index:05}.dat")) return os.path.isfile(os.path.join(self.nodes[node_number].datadir, self.chain, "blocks", f"blk{index:05}.dat"))