Skip to content

Commit 69b1021

Browse files
author
MacroFake
committed
Merge bitcoin/bitcoin#26381: test: Fix intermittent issue in p2p_sendtxrcncl.py
fa3da83 test: Check debug log as well in p2p_sendtxrcncl.py (MacroFake) fae0439 test: Check correct disconnect reason in p2p_sendtxrcncl.py (MacroFake) fa590cf test: Fix intermittent issue in p2p_sendtxrcncl.py (MacroFake) Pull request description: Should fix bitcoin/bitcoin#26364 I can't reproduce this, but my guess would be that `PeerNoVerack::on_version`, which sends the `wtxidrelay` message, is executed in the event loop and thus may run after the main thread sending `msg_verack`. Also, fix another bug. Finally, add some `assert_debug_log` to ensure the right code branch is executed (and not some random, unrelated disconnect). ACKs for top commit: naumenkogs: ACK fa3da83 Tree-SHA512: ee2988372223ea22e94e9783ef6d37114a3945991b6d60f0157917f3850fb7077c566564c3771d915ee74ab28202a3b73c6d89ddec6e2c918462db9a3c02e6cf
2 parents a1fff27 + fa3da83 commit 69b1021

File tree

1 file changed

+23
-19
lines changed

1 file changed

+23
-19
lines changed

test/functional/p2p_sendtxrcncl.py

Lines changed: 23 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -107,37 +107,39 @@ def run_test(self):
107107
peer.send_message(create_sendtxrcncl_msg())
108108
self.wait_until(lambda : "sendtxrcncl" in self.nodes[0].getpeerinfo()[-1]["bytesrecv_per_msg"])
109109
self.log.info('second SENDTXRCNCL triggers a disconnect')
110-
peer.send_message(create_sendtxrcncl_msg())
111-
peer.wait_for_disconnect()
110+
with self.nodes[0].assert_debug_log(["(sendtxrcncl received from already registered peer); disconnecting"]):
111+
peer.send_message(create_sendtxrcncl_msg())
112+
peer.wait_for_disconnect()
112113

113114
self.log.info('SENDTXRCNCL with initiator=responder=0 triggers a disconnect')
114115
sendtxrcncl_no_role = create_sendtxrcncl_msg()
115116
sendtxrcncl_no_role.initiator = False
116117
sendtxrcncl_no_role.responder = False
117118
peer = self.nodes[0].add_p2p_connection(PeerNoVerack(), send_version=True, wait_for_verack=False)
118-
peer.send_message(sendtxrcncl_no_role)
119-
peer.wait_for_disconnect()
119+
with self.nodes[0].assert_debug_log(["txreconciliation protocol violation"]):
120+
peer.send_message(sendtxrcncl_no_role)
121+
peer.wait_for_disconnect()
120122

121123
self.log.info('SENDTXRCNCL with initiator=0 and responder=1 from inbound triggers a disconnect')
122124
sendtxrcncl_wrong_role = create_sendtxrcncl_msg(initiator=False)
123125
peer = self.nodes[0].add_p2p_connection(PeerNoVerack(), send_version=True, wait_for_verack=False)
124-
peer.send_message(sendtxrcncl_wrong_role)
125-
peer.wait_for_disconnect()
126+
with self.nodes[0].assert_debug_log(["txreconciliation protocol violation"]):
127+
peer.send_message(sendtxrcncl_wrong_role)
128+
peer.wait_for_disconnect()
126129

127130
self.log.info('SENDTXRCNCL with version=0 triggers a disconnect')
128131
sendtxrcncl_low_version = create_sendtxrcncl_msg()
129132
sendtxrcncl_low_version.version = 0
130133
peer = self.nodes[0].add_p2p_connection(PeerNoVerack(), send_version=True, wait_for_verack=False)
131-
peer.send_message(sendtxrcncl_low_version)
132-
peer.wait_for_disconnect()
134+
with self.nodes[0].assert_debug_log(["txreconciliation protocol violation"]):
135+
peer.send_message(sendtxrcncl_low_version)
136+
peer.wait_for_disconnect()
133137

134138
self.log.info('sending SENDTXRCNCL after sending VERACK triggers a disconnect')
135-
# We use PeerNoVerack even though verack is sent right after, to make sure it was actually
136-
# sent before sendtxrcncl is sent.
137-
peer = self.nodes[0].add_p2p_connection(PeerNoVerack(), send_version=True, wait_for_verack=False)
138-
peer.send_and_ping(msg_verack())
139-
peer.send_message(create_sendtxrcncl_msg())
140-
peer.wait_for_disconnect()
139+
peer = self.nodes[0].add_p2p_connection(P2PInterface())
140+
with self.nodes[0].assert_debug_log(["sendtxrcncl received after verack"]):
141+
peer.send_message(create_sendtxrcncl_msg())
142+
peer.wait_for_disconnect()
141143

142144
self.log.info('SENDTXRCNCL without WTXIDRELAY is ignored (recon state is erased after VERACK)')
143145
peer = self.nodes[0].add_p2p_connection(PeerNoVerack(wtxidrelay=False), send_version=True, wait_for_verack=False)
@@ -164,15 +166,17 @@ def run_test(self):
164166
self.log.info('SENDTXRCNCL if block-relay-only triggers a disconnect')
165167
peer = self.nodes[0].add_outbound_p2p_connection(
166168
PeerNoVerack(), wait_for_verack=False, p2p_idx=3, connection_type="block-relay-only")
167-
peer.send_message(create_sendtxrcncl_msg(initiator=False))
168-
peer.wait_for_disconnect()
169+
with self.nodes[0].assert_debug_log(["we indicated no tx relay; disconnecting"]):
170+
peer.send_message(create_sendtxrcncl_msg(initiator=False))
171+
peer.wait_for_disconnect()
169172

170173
self.log.info('SENDTXRCNCL with initiator=1 and responder=0 from outbound triggers a disconnect')
171174
sendtxrcncl_wrong_role = create_sendtxrcncl_msg(initiator=True)
172175
peer = self.nodes[0].add_outbound_p2p_connection(
173-
P2PInterface(), wait_for_verack=False, p2p_idx=4, connection_type="outbound-full-relay")
174-
peer.send_message(sendtxrcncl_wrong_role)
175-
peer.wait_for_disconnect()
176+
PeerNoVerack(), wait_for_verack=False, p2p_idx=4, connection_type="outbound-full-relay")
177+
with self.nodes[0].assert_debug_log(["txreconciliation protocol violation"]):
178+
peer.send_message(sendtxrcncl_wrong_role)
179+
peer.wait_for_disconnect()
176180

177181
self.log.info('SENDTXRCNCL not sent if -txreconciliation flag is not set')
178182
self.restart_node(0, [])

0 commit comments

Comments
 (0)