Skip to content

Commit 6b212cb

Browse files
author
MarcoFalke
committed
Merge bitcoin/bitcoin#23720: test: Refactor addr_relay.py addr generation, increase mocktime
261dddb test: Combine addr generation helper functions (Martin Zumsande) aeeccd9 test: Fix intermittent issue in p2p_addr_relay.py (Martin Zumsande) Pull request description: Fixes #22449 by increasing the mocktime jump (just as in bitcoin/bitcoin@6168eb0), which prevents failures due to rare Poisson timer events, or at least makes them a lot more unlikely. The second commit combines the addr generation helper functions `setup_addr_msg` and `setup_rand_addr_msg`. It also changes the way `addr.time` is filled to random, because before, if too many addresses (>600) were created in a batch, they would stop being relayed because their timestamp would be too far in the future. ACKs for top commit: josibake: reACK bitcoin/bitcoin@261dddb jnewbery: utACK 261dddb Tree-SHA512: d0eca887de4bc85092730284cf612193d2c12b0a3d624a2bfa5fef4a5890d3b6375c564333c5927425958e4b6ec86b8854b18b2233c7b6f1691d9ddc397948a9
2 parents df6e961 + 261dddb commit 6b212cb

File tree

1 file changed

+16
-21
lines changed

1 file changed

+16
-21
lines changed

test/functional/p2p_addr_relay.py

Lines changed: 16 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ def on_addr(self, message):
4444
assert_equal(addr.nServices, 9)
4545
if not 8333 <= addr.port < 8343:
4646
raise AssertionError("Invalid addr.port of {} (8333-8342 expected)".format(addr.port))
47-
assert addr.ip.startswith('123.123.123.')
47+
assert addr.ip.startswith('123.123.')
4848

4949
def on_getaddr(self, message):
5050
# When the node sends us a getaddr, it increments the addr relay tokens for the connection by 1000
@@ -91,37 +91,31 @@ def run_test(self):
9191
self.blocksonly_mode_tests()
9292
self.rate_limit_tests()
9393

94-
def setup_addr_msg(self, num):
94+
def setup_addr_msg(self, num, sequential_ips=True):
9595
addrs = []
9696
for i in range(num):
9797
addr = CAddress()
98-
addr.time = self.mocktime + i
98+
addr.time = self.mocktime + random.randrange(-100, 100)
9999
addr.nServices = P2P_SERVICES
100-
addr.ip = f"123.123.123.{self.counter % 256}"
100+
if sequential_ips:
101+
assert self.counter < 256 ** 2 # Don't allow the returned ip addresses to wrap.
102+
addr.ip = f"123.123.{self.counter // 256}.{self.counter % 256}"
103+
self.counter += 1
104+
else:
105+
addr.ip = f"{random.randrange(128,169)}.{random.randrange(1,255)}.{random.randrange(1,255)}.{random.randrange(1,255)}"
101106
addr.port = 8333 + i
102107
addrs.append(addr)
103-
self.counter += 1
104108

105109
msg = msg_addr()
106110
msg.addrs = addrs
107111
return msg
108112

109-
def setup_rand_addr_msg(self, num):
110-
addrs = []
111-
for i in range(num):
112-
addr = CAddress()
113-
addr.time = self.mocktime + i
114-
addr.nServices = P2P_SERVICES
115-
addr.ip = f"{random.randrange(128,169)}.{random.randrange(1,255)}.{random.randrange(1,255)}.{random.randrange(1,255)}"
116-
addr.port = 8333
117-
addrs.append(addr)
118-
msg = msg_addr()
119-
msg.addrs = addrs
120-
return msg
121-
122113
def send_addr_msg(self, source, msg, receivers):
123114
source.send_and_ping(msg)
124-
# pop m_next_addr_send timer
115+
# invoke m_next_addr_send timer:
116+
# `addr` messages are sent on an exponential distribution with mean interval of 30s.
117+
# Setting the mocktime 600s forward gives a probability of (1 - e^-(600/30)) that
118+
# the event will occur (i.e. this fails once in ~500 million repeats).
125119
self.mocktime += 10 * 60
126120
self.nodes[0].setmocktime(self.mocktime)
127121
for peer in receivers:
@@ -282,7 +276,8 @@ def getaddr_tests(self):
282276
block_relay_peer.send_and_ping(msg_getaddr())
283277
inbound_peer.send_and_ping(msg_getaddr())
284278

285-
self.mocktime += 5 * 60
279+
# invoke m_next_addr_send timer, see under send_addr_msg() function for rationale
280+
self.mocktime += 10 * 60
286281
self.nodes[0].setmocktime(self.mocktime)
287282
inbound_peer.wait_until(lambda: inbound_peer.addr_received() is True)
288283

@@ -313,7 +308,7 @@ def blocksonly_mode_tests(self):
313308
def send_addrs_and_test_rate_limiting(self, peer, no_relay, *, new_addrs, total_addrs):
314309
"""Send an addr message and check that the number of addresses processed and rate-limited is as expected"""
315310

316-
peer.send_and_ping(self.setup_rand_addr_msg(new_addrs))
311+
peer.send_and_ping(self.setup_addr_msg(new_addrs, sequential_ips=False))
317312

318313
peerinfo = self.nodes[0].getpeerinfo()[0]
319314
addrs_processed = peerinfo['addr_processed']

0 commit comments

Comments
 (0)