Skip to content

Commit 68ca13e

Browse files
committed
Merge bitcoin/bitcoin#32823: test: Fix wait_for_getheaders() call in test_outbound_eviction_blocks_relay_only()
ec004cd test: Use rehash() in outbound eviction block-relay (pablomartin4btc) 26598ed test: Clarify roles in outbound eviction comments (pablomartin4btc) Pull request description: This change avoids relying on `tip_header.hash`, which is `None` when the header is deserialized from hex during `CBlockHeader()` construction. Instead, `tip_header.rehash()` explicitly computes the hash, making the test behavior more robust. Using the explicit `rehash()` avoids depending on `wait_for_getheaders()` falling back to any received message, thus making the test more deterministic. This is a follow-up to #32742. Also, as noted in a previous review [comment](bitcoin/bitcoin#32742 (review)), "_the hash field is wrong either way, simply due to being the wrong type (it is an optional hex string), as opposed to an optional int_". --- The first commit intention is to improve clarity around the tests purpose, helping reviewers follow what's being verified and why. What started as a small comment during review of #32742 led me reviewing and try to improve most relevant tests comments for consistency and correctness. ACKs for top commit: achow101: ACK ec004cd theStack: lgtm ACK ec004cd #️⃣ yuvicc: ACK ec004cd danielabrozzoni: ACK ec004cd Tree-SHA512: 6a14dedfdc425cd806f63443b3b9f79df69a7717452739f5d7fef1b2bdba23402670d63cf1d6b66c9f1a6b460d4d4a6f185426d0a4982fa95115a234cd6baef7
2 parents 35cae56 + ec004cd commit 68ca13e

File tree

1 file changed

+15
-13
lines changed

1 file changed

+15
-13
lines changed

test/functional/p2p_outbound_eviction.py

Lines changed: 15 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ def test_outbound_eviction_unprotected(self):
5555
self.log.info("Test that the peer gets evicted")
5656
peer.wait_for_disconnect()
5757

58-
self.log.info("Create an outbound connection and send header but never catch up")
58+
self.log.info("Create an outbound connection and send header but the peer never catches up")
5959
# Mimic a node that just falls behind for long enough
6060
# This should also apply for a node doing IBD that does not catch up in time
6161
# Connect a peer and make it send us headers ending in our tip's parent
@@ -75,15 +75,15 @@ def test_outbound_eviction_unprotected(self):
7575
self.log.info("Create an outbound connection and keep lagging behind, but not too much")
7676
# Test that if the peer never catches up with our current tip, but it does with the
7777
# expected work that we set when setting the timer (that is, our tip at the time)
78-
# we do not disconnect the peer
78+
# the node does not disconnect the peer
7979
peer = node.add_outbound_p2p_connection(P2PInterface(), p2p_idx=0, connection_type="outbound-full-relay")
8080

8181
self.log.info("Mine a block so our peer starts lagging")
8282
prev_prev_hash = tip_header.hashPrevBlock
8383
best_block_hash = self.generateblock(node, output="raw(42)", transactions=[])["hash"]
8484
peer.sync_with_ping()
8585

86-
self.log.info("Keep catching up with the old tip and check that we are not evicted")
86+
self.log.info("The peer keeps catching up with the old tip; check that the node does not evict the peer")
8787
for i in range(10):
8888
# Generate an additional block so the peers is 2 blocks behind
8989
prev_header = from_hex(CBlockHeader(), node.getblockheader(best_block_hash, False))
@@ -96,21 +96,21 @@ def test_outbound_eviction_unprotected(self):
9696
node.setmocktime(cur_mock_time)
9797
peer.sync_with_ping()
9898

99-
# Wait until we get out last call (by receiving a getheaders)
99+
# Make the peer wait until it gets node's last call (by receiving a getheaders)
100100
peer.wait_for_getheaders(block_hash=prev_prev_hash)
101101

102-
# Send a header with the previous tip (so we go back to 1 block behind)
102+
# The peer sends a header with the previous tip (so the peer goes back to 1 block behind)
103103
peer.send_and_ping(msg_headers([prev_header]))
104104
prev_prev_hash = tip_header.hashPrevBlock
105105

106106
self.log.info("Create an outbound connection and take some time to catch up, but do it in time")
107107
# Check that if the peer manages to catch up within time, the timeouts are removed (and the peer is not disconnected)
108-
# We are reusing the peer from the previous case which already sent us a valid (but old) block and whose timer is ticking
108+
# We are reusing the peer from the previous case which already sent the node a valid (but old) block and whose timer is ticking
109109

110-
# Send an updated headers message matching our tip
110+
# Make the peer send an updated headers message matching our tip
111111
peer.send_and_ping(msg_headers([from_hex(CBlockHeader(), node.getblockheader(best_block_hash, False))]))
112112

113-
# Wait for long enough for the timeouts to have triggered and check that we are still connected
113+
# Wait for long enough for the timeouts to have triggered and check that the peer is still connected
114114
cur_mock_time += (CHAIN_SYNC_TIMEOUT + 1)
115115
node.setmocktime(cur_mock_time)
116116
peer.sync_with_ping()
@@ -123,8 +123,10 @@ def test_outbound_eviction_unprotected(self):
123123

124124
def test_outbound_eviction_protected(self):
125125
# This tests the eviction logic for **protected** outbound peers (that is, PeerManagerImpl::ConsiderEviction)
126-
# Outbound connections are flagged as protected as long as they have sent us a connecting block with at least as
127-
# much work as our current tip and we have enough empty protected_peers slots.
126+
# Outbound connections are flagged as protected if:
127+
# - The peer sends a connecting block with at least as much work as our current tip.
128+
# - There are still available slots in the node's protected_peers list.
129+
# This test ensures that such protected outbound peers are not disconnected even after chain sync and headers timeouts.
128130
node = self.nodes[0]
129131
cur_mock_time = node.mocktime
130132
tip_header = from_hex(CBlockHeader(), node.getblockheader(node.getbestblockhash(), False))
@@ -145,7 +147,7 @@ def test_outbound_eviction_protected(self):
145147
peer.wait_for_getheaders(block_hash=tip_header.hashPrevBlock)
146148
cur_mock_time += (HEADERS_RESPONSE_TIME + 1)
147149
node.setmocktime(cur_mock_time)
148-
self.log.info("Test that the node does not get evicted")
150+
self.log.info("Test that the peer does not get evicted")
149151
peer.sync_with_ping()
150152

151153
node.disconnect_p2ps()
@@ -205,7 +207,7 @@ def test_outbound_eviction_mixed(self):
205207

206208
cur_mock_time += (HEADERS_RESPONSE_TIME + 1)
207209
node.setmocktime(cur_mock_time)
208-
self.log.info("Check how none of the honest nor protected peers was evicted but all the misbehaving unprotected were")
210+
self.log.info("Check that none of the honest or protected peers were evicted, but all misbehaving unprotected peers were")
209211
for peer in protected_peers + honest_unprotected_peers:
210212
peer.sync_with_ping()
211213
for peer in misbehaving_unprotected_peers:
@@ -233,7 +235,7 @@ def test_outbound_eviction_blocks_relay_only(self):
233235
cur_mock_time += (CHAIN_SYNC_TIMEOUT + 1)
234236
node.setmocktime(cur_mock_time)
235237
peer.sync_with_ping()
236-
peer.wait_for_getheaders(block_hash=tip_header.hash)
238+
peer.wait_for_getheaders(block_hash=tip_header.rehash())
237239
cur_mock_time += (HEADERS_RESPONSE_TIME + 1)
238240
node.setmocktime(cur_mock_time)
239241
self.log.info("Test that the peer gets evicted")

0 commit comments

Comments
 (0)