Merge bitcoin/bitcoin#31696: test: Check that reindex with prune wipes blk files

fa9aced800 test: Check that reindex with prune wipes blk files (MarcoFalke)
fa9593efc2 test: Use high-level python types (MarcoFalke)

Pull request description:

  This adds missing test coverage for `CleanupBlockRevFiles`.

ACKs for top commit:
  TheCharlatan:
    Re-ACK fa9aced800
  l0rinc:
    ACK fa9aced800
  tdb3:
    re ACK fa9aced800

Tree-SHA512: b31ff8a896ce344437715e7fb7efdb8cd7e11470e8465d8972fddfdb58ffd78257786c4060e8596cc53b6278f8ac6a9b6eb05a06e9df58b8b240bdaa719a8e5b
This commit is contained in:
merge-script
2025-01-23 12:42:55 +00:00

View File

@ -1,12 +1,13 @@
#!/usr/bin/env python3 #!/usr/bin/env python3
# Copyright (c) 2022 The Bitcoin Core developers # Copyright (c) 2022-present The Bitcoin Core developers
# Distributed under the MIT software license, see the accompanying # Distributed under the MIT software license, see the accompanying
# file COPYING or http://www.opensource.org/licenses/mit-license.php. # file COPYING or http://www.opensource.org/licenses/mit-license.php.
"""Test removing undeleted pruned blk files on startup.""" """Tests around pruning rev and blk files on startup."""
import platform import platform
import os
from test_framework.test_framework import BitcoinTestFramework from test_framework.test_framework import BitcoinTestFramework
from test_framework.util import assert_equal
class FeatureRemovePrunedFilesOnStartupTest(BitcoinTestFramework): class FeatureRemovePrunedFilesOnStartupTest(BitcoinTestFramework):
def set_test_params(self): def set_test_params(self):
@ -18,7 +19,6 @@ class FeatureRemovePrunedFilesOnStartupTest(BitcoinTestFramework):
for _ in range(n): for _ in range(n):
self.generate(self.nodes[0], 250) self.generate(self.nodes[0], 250)
self.generate(self.nodes[0], blocks % 250) self.generate(self.nodes[0], blocks % 250)
self.sync_blocks()
def run_test(self): def run_test(self):
blk0 = self.nodes[0].blocks_path / "blk00000.dat" blk0 = self.nodes[0].blocks_path / "blk00000.dat"
@ -26,30 +26,47 @@ class FeatureRemovePrunedFilesOnStartupTest(BitcoinTestFramework):
blk1 = self.nodes[0].blocks_path / "blk00001.dat" blk1 = self.nodes[0].blocks_path / "blk00001.dat"
rev1 = self.nodes[0].blocks_path / "rev00001.dat" rev1 = self.nodes[0].blocks_path / "rev00001.dat"
self.mine_batches(800) self.mine_batches(800)
fo1 = os.open(blk0, os.O_RDONLY)
fo2 = os.open(rev1, os.O_RDONLY) self.log.info("Open some files to check that this may delay deletion")
fd1 = os.fdopen(fo1) fd1 = open(blk0, "rb")
fd2 = os.fdopen(fo2) fd2 = open(rev1, "rb")
self.nodes[0].pruneblockchain(600) self.nodes[0].pruneblockchain(600)
# Windows systems will not remove files with an open fd # Windows systems will not remove files with an open fd
if platform.system() != 'Windows': if platform.system() != 'Windows':
assert not os.path.exists(blk0) assert not blk0.exists()
assert not os.path.exists(rev0) assert not rev0.exists()
assert not os.path.exists(blk1) assert not blk1.exists()
assert not os.path.exists(rev1) assert not rev1.exists()
else: else:
assert os.path.exists(blk0) assert blk0.exists()
assert not os.path.exists(rev0) assert not rev0.exists()
assert not os.path.exists(blk1) assert not blk1.exists()
assert os.path.exists(rev1) assert rev1.exists()
# Check that the files are removed on restart once the fds are closed self.log.info("Check that the files are removed on restart once the fds are closed")
fd1.close() fd1.close()
fd2.close() fd2.close()
self.restart_node(0) self.restart_node(0)
assert not os.path.exists(blk0) assert not blk0.exists()
assert not os.path.exists(rev1) assert not rev1.exists()
self.log.info("Check that a reindex will wipe all files")
def ls_files():
ls = [
entry.name
for entry in self.nodes[0].blocks_path.iterdir()
if entry.is_file() and any(map(entry.name.startswith, ["rev", "blk"]))
]
return sorted(ls)
assert_equal(len(ls_files()), 4)
self.restart_node(0, extra_args=self.extra_args[0] + ["-reindex"])
assert_equal(self.nodes[0].getblockcount(), 0)
self.stop_node(0) # Stop node to flush the two newly created files
assert_equal(ls_files(), ["blk00000.dat", "rev00000.dat"])
if __name__ == '__main__': if __name__ == '__main__':
FeatureRemovePrunedFilesOnStartupTest(__file__).main() FeatureRemovePrunedFilesOnStartupTest(__file__).main()