diff --git a/test/functional/feature_init.py b/test/functional/feature_init.py index 7c157b5267d..8a936fc0a5a 100755 --- a/test/functional/feature_init.py +++ b/test/functional/feature_init.py @@ -88,7 +88,7 @@ class InitTest(BitcoinTestFramework): args = ['-txindex=1', '-blockfilterindex=1', '-coinstatsindex=1'] for terminate_line in lines_to_terminate_after: - self.log.info(f"Starting node and will exit after line {terminate_line}") + self.log.info(f"Starting node and will terminate after line {terminate_line}") with node.busy_wait_for_debug_log([terminate_line]): if platform.system() == 'Windows': # CREATE_NEW_PROCESS_GROUP is required in order to be able @@ -108,12 +108,22 @@ class InitTest(BitcoinTestFramework): 'blocks/index/*.ldb': 'Error opening block database.', 'chainstate/*.ldb': 'Error opening coins database.', 'blocks/blk*.dat': 'Error loading block database.', + 'indexes/txindex/MANIFEST*': 'LevelDB error: Corruption: CURRENT points to a non-existent file', + # Removing these files does not result in a startup error: + # 'indexes/blockfilter/basic/*.dat', 'indexes/blockfilter/basic/db/*.*', 'indexes/coinstats/db/*.*', + # 'indexes/txindex/*.log', 'indexes/txindex/CURRENT', 'indexes/txindex/LOCK' } files_to_perturb = { 'blocks/index/*.ldb': 'Error loading block database.', 'chainstate/*.ldb': 'Error opening coins database.', 'blocks/blk*.dat': 'Corrupted block database detected.', + 'indexes/blockfilter/basic/db/*.*': 'LevelDB error: Corruption', + 'indexes/coinstats/db/*.*': 'LevelDB error: Corruption', + 'indexes/txindex/*.log': 'LevelDB error: Corruption', + 'indexes/txindex/CURRENT': 'LevelDB error: Corruption', + # Perturbing these files does not result in a startup error: + # 'indexes/blockfilter/basic/*.dat', 'indexes/txindex/MANIFEST*', 'indexes/txindex/LOCK' } for file_patt, err_fragment in files_to_delete.items(): @@ -135,9 +145,10 @@ class InitTest(BitcoinTestFramework): self.stop_node(0) self.log.info("Test startup errors after perturbing certain essential files") + dirs = ["blocks", "chainstate", "indexes"] for file_patt, err_fragment in files_to_perturb.items(): - shutil.copytree(node.chain_path / "blocks", node.chain_path / "blocks_bak") - shutil.copytree(node.chain_path / "chainstate", node.chain_path / "chainstate_bak") + for dir in dirs: + shutil.copytree(node.chain_path / dir, node.chain_path / f"{dir}_bak") target_files = list(node.chain_path.glob(file_patt)) for target_file in target_files: @@ -151,10 +162,9 @@ class InitTest(BitcoinTestFramework): start_expecting_error(err_fragment) - shutil.rmtree(node.chain_path / "blocks") - shutil.rmtree(node.chain_path / "chainstate") - shutil.move(node.chain_path / "blocks_bak", node.chain_path / "blocks") - shutil.move(node.chain_path / "chainstate_bak", node.chain_path / "chainstate") + for dir in dirs: + shutil.rmtree(node.chain_path / dir) + shutil.move(node.chain_path / f"{dir}_bak", node.chain_path / dir) def init_pid_test(self): BITCOIN_PID_FILENAME_CUSTOM = "my_fancy_bitcoin_pid_file.foobar" diff --git a/test/functional/mempool_accept.py b/test/functional/mempool_accept.py index 27ecc3b4a84..9014ab260e1 100755 --- a/test/functional/mempool_accept.py +++ b/test/functional/mempool_accept.py @@ -45,6 +45,7 @@ from test_framework.util import ( assert_equal, assert_greater_than, assert_raises_rpc_error, + sync_txindex, ) from test_framework.wallet import MiniWallet from test_framework.wallet_util import generate_keypair @@ -270,6 +271,7 @@ class MempoolAcceptanceTest(BitcoinTestFramework): self.log.info('A coinbase transaction') # Pick the input of the first tx we created, so it has to be a coinbase tx + sync_txindex(self, node) raw_tx_coinbase_spent = node.getrawtransaction(txid=node.decoderawtransaction(hexstring=raw_tx_in_block)['vin'][0]['txid']) tx = tx_from_hex(raw_tx_coinbase_spent) self.check_mempool_result( diff --git a/test/functional/rpc_rawtransaction.py b/test/functional/rpc_rawtransaction.py index 18b1fc18967..3c3eb9fcb68 100755 --- a/test/functional/rpc_rawtransaction.py +++ b/test/functional/rpc_rawtransaction.py @@ -34,6 +34,7 @@ from test_framework.util import ( assert_equal, assert_greater_than, assert_raises_rpc_error, + sync_txindex, ) from test_framework.wallet import ( getnewdestination, @@ -70,7 +71,7 @@ class RawTransactionsTest(BitcoinTestFramework): self.num_nodes = 3 self.extra_args = [ ["-txindex"], - ["-txindex"], + [], ["-fastprune", "-prune=1"], ] # whitelist peers to speed up tx relay / mempool sync @@ -109,6 +110,7 @@ class RawTransactionsTest(BitcoinTestFramework): self.log.info(f"Test getrawtransaction {'with' if n == 0 else 'without'} -txindex") if n == 0: + sync_txindex(self, self.nodes[n]) # With -txindex. # 1. valid parameters - only supply txid assert_equal(self.nodes[n].getrawtransaction(txId), tx['hex']) diff --git a/test/functional/rpc_txoutproof.py b/test/functional/rpc_txoutproof.py index 90572245d60..d430f47f663 100755 --- a/test/functional/rpc_txoutproof.py +++ b/test/functional/rpc_txoutproof.py @@ -12,6 +12,7 @@ from test_framework.test_framework import BitcoinTestFramework from test_framework.util import ( assert_equal, assert_raises_rpc_error, + sync_txindex, ) from test_framework.wallet import MiniWallet @@ -77,6 +78,7 @@ class MerkleBlockTest(BitcoinTestFramework): assert_equal(sorted(self.nodes[0].verifytxoutproof(self.nodes[0].gettxoutproof([txid1, txid2]))), sorted(txlist)) assert_equal(sorted(self.nodes[0].verifytxoutproof(self.nodes[0].gettxoutproof([txid2, txid1]))), sorted(txlist)) # We can always get a proof if we have a -txindex + sync_txindex(self, self.nodes[1]) assert_equal(self.nodes[0].verifytxoutproof(self.nodes[1].gettxoutproof([txid_spent])), [txid_spent]) # We can't get a proof if we specify transactions from different blocks assert_raises_rpc_error(-5, "Not all transactions found in specified or retrieved block", self.nodes[0].gettxoutproof, [txid1, txid3]) diff --git a/test/functional/test_framework/util.py b/test/functional/test_framework/util.py index 14930ef6719..ceca0d3b19b 100644 --- a/test/functional/test_framework/util.py +++ b/test/functional/test_framework/util.py @@ -592,3 +592,10 @@ def find_vout_for_address(node, txid, addr): if addr == tx["vout"][i]["scriptPubKey"]["address"]: return i raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr)) + + +def sync_txindex(test_framework, node): + test_framework.log.debug("Waiting for node txindex to sync") + sync_start = int(time.time()) + test_framework.wait_until(lambda: node.getindexinfo("txindex")["txindex"]["synced"]) + test_framework.log.debug(f"Synced in {time.time() - sync_start} seconds") diff --git a/test/functional/wallet_avoid_mixing_output_types.py b/test/functional/wallet_avoid_mixing_output_types.py index 146b3df3f4d..38aeca76d20 100755 --- a/test/functional/wallet_avoid_mixing_output_types.py +++ b/test/functional/wallet_avoid_mixing_output_types.py @@ -117,7 +117,6 @@ class AddressInputTypeGrouping(BitcoinTestFramework): self.extra_args = [ [ "-addresstype=bech32", - "-txindex", ], [ "-addresstype=p2sh-segwit",