Merge bitcoin/bitcoin#27212: test: Make the unlikely race in p2p_invalid_messages impossible

fa1eb0ecaef14d428812f956082d29ab134fc728 test: Make the unlikely race in p2p_invalid_messages impossible (MarcoFalke)

Pull request description:

  After `add_p2p_connection` both sides have the verack processed.
  However the pong from conn in reply to the ping from the node has not
  been processed and recorded in totalbytesrecv.
  Flush the pong from conn by sending a ping from conn.

  This should make the unlikely race impossible.

ACKs for top commit:
  mzumsande:
    ACK fa1eb0ecaef14d428812f956082d29ab134fc728
  pinheadmz:
    ACK fa1eb0ecaef14d428812f956082d29ab134fc728

Tree-SHA512: 44166587572e8c0c758cac460fcfd5cf403b2883880128b13dc62e7f74ca5cb8f145bb68a903df177ff0e62faa360f913fd409b009d4cd1360f1f4403ade39ae
This commit is contained in:
fanquake 2023-03-17 14:43:06 +00:00 committed by pasta
parent 6f6b718f78
commit dbe2e04d62
No known key found for this signature in database
GPG Key ID: E2F3D7916E722D38

View File

@ -66,6 +66,11 @@ class InvalidMessagesTest(BitcoinTestFramework):
def test_buffer(self): def test_buffer(self):
self.log.info("Test message with header split across two buffers is received") self.log.info("Test message with header split across two buffers is received")
conn = self.nodes[0].add_p2p_connection(P2PDataStore()) conn = self.nodes[0].add_p2p_connection(P2PDataStore())
# After add_p2p_connection both sides have the verack processed.
# However the pong from conn in reply to the ping from the node has not
# been processed and recorded in totalbytesrecv.
# Flush the pong from conn by sending a ping from conn.
conn.sync_with_ping(timeout=1)
# Create valid message # Create valid message
msg = conn.build_message(msg_ping(nonce=12345)) msg = conn.build_message(msg_ping(nonce=12345))
cut_pos = 12 # Chosen at an arbitrary position within the header cut_pos = 12 # Chosen at an arbitrary position within the header
@ -75,8 +80,6 @@ class InvalidMessagesTest(BitcoinTestFramework):
# Wait until node has processed the first half of the message # Wait until node has processed the first half of the message
self.wait_until(lambda: self.nodes[0].getnettotals()['totalbytesrecv'] != before) self.wait_until(lambda: self.nodes[0].getnettotals()['totalbytesrecv'] != before)
middle = self.nodes[0].getnettotals()['totalbytesrecv'] middle = self.nodes[0].getnettotals()['totalbytesrecv']
# If this assert fails, we've hit an unlikely race
# where the test framework sent a message in between the two halves
assert_equal(middle, before + cut_pos) assert_equal(middle, before + cut_pos)
conn.send_raw_message(msg[cut_pos:]) conn.send_raw_message(msg[cut_pos:])
conn.sync_with_ping(timeout=1) conn.sync_with_ping(timeout=1)