Skip to content

Commit 431d81b

Browse files
committed
Merge bitcoin#15991: Bugfix: fix pruneblockchain returned prune height
f402012 fixup: Fix prunning test (João Barbosa) 97f517d Fix RPC/pruneblockchain returned prune height (Jonas Schnelli) Pull request description: The help of `pruneblockchain` tells us that the return value is `Height of the last block pruned.`,... but the implementation naively returns the provided input `height` and therefore not respecting that pruning can't be done on all possible blockheight due to the fact that we only prune complete blockfiles (which combine multiple blocks). This fixes the return value to actually return the correct prune height. ACKs for commit f40201: MarcoFalke: ACK f402012 Tree-SHA512: 88c910030ffb83196663e5ebebc29d036fcdbbb2ab266e4538991867924a61bacd8361c1fbf294a0ea7e02347ae183d792f10a10b8f6187e8a4c4c6e4124d7e6
2 parents afab131 + f402012 commit 431d81b

File tree

2 files changed

+9
-17
lines changed

2 files changed

+9
-17
lines changed

Diff for: src/rpc/blockchain.cpp

+6-1
Original file line numberDiff line numberDiff line change
@@ -1061,7 +1061,12 @@ static UniValue pruneblockchain(const JSONRPCRequest& request)
10611061
}
10621062

10631063
PruneBlockFilesManual(height);
1064-
return uint64_t(height);
1064+
const CBlockIndex* block = ::ChainActive().Tip();
1065+
assert(block);
1066+
while (block->pprev && (block->pprev->nStatus & BLOCK_HAVE_DATA)) {
1067+
block = block->pprev;
1068+
}
1069+
return uint64_t(block->nHeight);
10651070
}
10661071

10671072
static UniValue gettxoutsetinfo(const JSONRPCRequest& request)

Diff for: test/functional/feature_pruning.py

+3-16
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,6 @@
2323
wait_until,
2424
)
2525

26-
MIN_BLOCKS_TO_KEEP = 288
27-
2826
# Rescans start at the earliest block up to 2 hours before a key timestamp, so
2927
# the manual prune RPC avoids pruning blocks in the same window to be
3028
# compatible with pruning based on key creation time.
@@ -273,20 +271,9 @@ def height(index):
273271
else:
274272
return index
275273

276-
def prune(index, expected_ret=None):
274+
def prune(index):
277275
ret = node.pruneblockchain(height=height(index))
278-
# Check the return value. When use_timestamp is True, just check
279-
# that the return value is less than or equal to the expected
280-
# value, because when more than one block is generated per second,
281-
# a timestamp will not be granular enough to uniquely identify an
282-
# individual block.
283-
if expected_ret is None:
284-
expected_ret = index
285-
if use_timestamp:
286-
assert_greater_than(ret, 0)
287-
assert_greater_than(expected_ret + 1, ret)
288-
else:
289-
assert_equal(ret, expected_ret)
276+
assert_equal(ret, node.getblockchaininfo()['pruneheight'])
290277

291278
def has_block(index):
292279
return os.path.isfile(os.path.join(self.nodes[node_number].datadir, "regtest", "blocks", "blk{:05}.dat".format(index)))
@@ -326,7 +313,7 @@ def has_block(index):
326313
assert not has_block(1), "blk00001.dat is still there, should be pruned by now"
327314

328315
# height=1000 should not prune anything more, because tip-288 is in blk00002.dat.
329-
prune(1000, 1001 - MIN_BLOCKS_TO_KEEP)
316+
prune(1000)
330317
assert has_block(2), "blk00002.dat is still there, should be pruned by now"
331318

332319
# advance the tip so blk00002.dat and blk00003.dat can be pruned (the last 288 blocks should now be in blk00004.dat)

0 commit comments

Comments
 (0)