Merge #11538: qa: Fix race condition failures in replace-by-fee.py, sendheaders.py
6d51eaefe
qa: Fix race condition in sendheaders.py (Suhas Daftuar)c96b2e4f0
qa: Fix replace-by-fee race condition failures (Suhas Daftuar) Pull request description: I think #11407 broke replace-by-fee by introducing a race condition. I was observing frequent failures of replace-by-fee locally, always with a mempool sync failure (the sync call was added in #11407). It appeared to me like there were two causes: sometimes the node would be in IBD and not request the transaction that was relayed; other times the blocks generated in make_utxo wouldn't have relayed quickly enough for the spend of the transaction to be accepted. I believe I've fixed both potential errors. ping @instagibbs Edit: I found a race condition in the sendheaders.py test, where if the verack from the python node wasn't processed before the first block in the test was generated, then no block announcement would go out to that peer, breaking the test. Fixed by adding a sync_with_ping after waiting for verack. Tree-SHA512: 6ad160966e432c151c1ce6e88ae67e60e47123523bda3755cf7697a00e1a5ba38de8561751826e3d7cf0e492f8c2aec298e1b4de8424ebbaf497f099a1ef1d07
This commit is contained in:
commit
57ee73990f
2 changed files with 16 additions and 1 deletions
|
@ -72,8 +72,14 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||
["-mempoolreplacement=0"]]
|
||||
|
||||
def run_test(self):
|
||||
# Leave IBD
|
||||
self.nodes[0].generate(1)
|
||||
|
||||
make_utxo(self.nodes[0], 1*COIN)
|
||||
|
||||
# Ensure nodes are synced
|
||||
self.sync_all()
|
||||
|
||||
self.log.info("Running test simple doublespend...")
|
||||
self.test_simple_doublespend()
|
||||
|
||||
|
@ -110,13 +116,18 @@ class ReplaceByFeeTest(BitcoinTestFramework):
|
|||
"""Simple doublespend"""
|
||||
tx0_outpoint = make_utxo(self.nodes[0], int(1.1*COIN))
|
||||
|
||||
# make_utxo may have generated a bunch of blocks, so we need to sync
|
||||
# before we can spend the coins generated, or else the resulting
|
||||
# transactions might not be accepted by our peers.
|
||||
self.sync_all()
|
||||
|
||||
tx1a = CTransaction()
|
||||
tx1a.vin = [CTxIn(tx0_outpoint, nSequence=0)]
|
||||
tx1a.vout = [CTxOut(1*COIN, CScript([b'a']))]
|
||||
tx1a_hex = txToHex(tx1a)
|
||||
tx1a_txid = self.nodes[0].sendrawtransaction(tx1a_hex, True)
|
||||
|
||||
self.sync_all([self.nodes])
|
||||
self.sync_all()
|
||||
|
||||
# Should fail because we haven't changed the fee
|
||||
tx1b = CTransaction()
|
||||
|
|
|
@ -225,6 +225,10 @@ class SendHeadersTest(BitcoinTestFramework):
|
|||
inv_node.wait_for_verack()
|
||||
test_node.wait_for_verack()
|
||||
|
||||
# Ensure verack's have been processed by our peer
|
||||
inv_node.sync_with_ping()
|
||||
test_node.sync_with_ping()
|
||||
|
||||
tip = int(self.nodes[0].getbestblockhash(), 16)
|
||||
|
||||
# PART 1
|
||||
|
|
Loading…
Reference in a new issue