mirror of
https://github.com/bitcoin/bitcoin.git
synced 2026-04-10 07:37:59 +02:00
test: Fix intermittent issue in wallet_assumeutxo.py
This commit is contained in:
@@ -721,6 +721,16 @@ def find_vout_for_address(node, txid, addr):
|
|||||||
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
raise RuntimeError("Vout not found for address: txid=%s, addr=%s" % (txid, addr))
|
||||||
|
|
||||||
|
|
||||||
|
def dumb_sync_blocks(*, src, dst, height=None):
|
||||||
|
"""Sync blocks between `src` and `dst` nodes via RPC submitblock up to height."""
|
||||||
|
height = height or src.getblockcount()
|
||||||
|
for i in range(dst.getblockcount() + 1, height + 1):
|
||||||
|
block_hash = src.getblockhash(i)
|
||||||
|
block = src.getblock(blockhash=block_hash, verbose=0)
|
||||||
|
dst.submitblock(block)
|
||||||
|
assert_equal(dst.getblockcount(), height)
|
||||||
|
|
||||||
|
|
||||||
def sync_txindex(test_framework, node):
|
def sync_txindex(test_framework, node):
|
||||||
test_framework.log.debug("Waiting for node txindex to sync")
|
test_framework.log.debug("Waiting for node txindex to sync")
|
||||||
sync_start = int(time.time())
|
sync_start = int(time.time())
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ from test_framework.messages import COIN
|
|||||||
from test_framework.util import (
|
from test_framework.util import (
|
||||||
assert_equal,
|
assert_equal,
|
||||||
assert_greater_than,
|
assert_greater_than,
|
||||||
assert_greater_than_or_equal,
|
|
||||||
assert_raises_rpc_error,
|
assert_raises_rpc_error,
|
||||||
|
dumb_sync_blocks,
|
||||||
ensure_for,
|
ensure_for,
|
||||||
)
|
)
|
||||||
from test_framework.wallet import MiniWallet
|
from test_framework.wallet import MiniWallet
|
||||||
@@ -42,8 +42,8 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|||||||
def setup_network(self):
|
def setup_network(self):
|
||||||
"""Start with the nodes disconnected so that one can generate a snapshot
|
"""Start with the nodes disconnected so that one can generate a snapshot
|
||||||
including blocks the other hasn't yet seen."""
|
including blocks the other hasn't yet seen."""
|
||||||
self.add_nodes(4)
|
self.add_nodes(self.num_nodes, self.extra_args)
|
||||||
self.start_nodes(extra_args=self.extra_args)
|
self.start_nodes()
|
||||||
|
|
||||||
def import_descriptor(self, node, wallet_name, key, timestamp):
|
def import_descriptor(self, node, wallet_name, key, timestamp):
|
||||||
import_request = [{"desc": descsum_create("pkh(" + key.pubkey + ")"),
|
import_request = [{"desc": descsum_create("pkh(" + key.pubkey + ")"),
|
||||||
@@ -227,32 +227,18 @@ class AssumeutxoTest(BitcoinTestFramework):
|
|||||||
|
|
||||||
PAUSE_HEIGHT = FINAL_HEIGHT - 40
|
PAUSE_HEIGHT = FINAL_HEIGHT - 40
|
||||||
|
|
||||||
self.log.info("Restarting node to stop at height %d", PAUSE_HEIGHT)
|
self.log.info(f"Unload wallets and sync node up to height {PAUSE_HEIGHT}")
|
||||||
self.restart_node(1, extra_args=[
|
n1.unloadwallet("w")
|
||||||
f"-stopatheight={PAUSE_HEIGHT}", *self.extra_args[1]])
|
n1.unloadwallet(wallet_name)
|
||||||
|
dumb_sync_blocks(src=n0, dst=n1, height=PAUSE_HEIGHT)
|
||||||
|
|
||||||
# Finally connect the nodes and let them sync.
|
self.log.info("Verify node state during background sync")
|
||||||
#
|
|
||||||
# Set `wait_for_connect=False` to avoid a race between performing connection
|
|
||||||
# assertions and the -stopatheight tripping.
|
|
||||||
self.connect_nodes(0, 1, wait_for_connect=False)
|
|
||||||
|
|
||||||
n1.wait_until_stopped(timeout=5)
|
|
||||||
|
|
||||||
self.log.info(
|
|
||||||
"Restarted node before snapshot validation completed, reloading...")
|
|
||||||
self.restart_node(1, extra_args=self.extra_args[1])
|
|
||||||
|
|
||||||
self.log.info("Verify node state after restart during background sync")
|
|
||||||
# Verify there are still two chainstates (background validation not complete)
|
# Verify there are still two chainstates (background validation not complete)
|
||||||
chainstates = n1.getchainstates()['chainstates']
|
chainstates = n1.getchainstates()['chainstates']
|
||||||
assert_equal(len(chainstates), 2)
|
assert_equal(len(chainstates), 2)
|
||||||
# The background chainstate should still be at START_HEIGHT
|
# The background chainstate should still be at START_HEIGHT
|
||||||
assert_equal(chainstates[0]['blocks'], START_HEIGHT)
|
assert_equal(chainstates[0]['blocks'], START_HEIGHT)
|
||||||
# The snapshot chainstate should be at least PAUSE_HEIGHT. It may be
|
assert_equal(chainstates[1]["blocks"], PAUSE_HEIGHT)
|
||||||
# higher because stopatheight may allow additional blocks to be
|
|
||||||
# processed during shutdown (per stopatheight documentation).
|
|
||||||
assert_greater_than_or_equal(chainstates[1]['blocks'], PAUSE_HEIGHT)
|
|
||||||
|
|
||||||
# After restart, wallets that existed before cannot be loaded because
|
# After restart, wallets that existed before cannot be loaded because
|
||||||
# the wallet loading code checks if required blocks are available for
|
# the wallet loading code checks if required blocks are available for
|
||||||
|
|||||||
Reference in New Issue
Block a user