HomePhabricator

p2p: AddrFetch - don't disconnect on self-announcements

Description

p2p: AddrFetch - don't disconnect on self-announcements

Summary:

AddrFetch connections (old name: oneshots) are intended to be short-lived connections on which we ask a peer for addresses via getaddr and disconnect after receiving them.

This is done by disconnecting after receiving the first addr. However, it is no longer working as intended, because nowadays, the first addr a typical bitcoin core node sends is its self-announcement.
So we'll disconnect before the peer gets a chance to answer our getaddr.

I checked that this affects both -seednode peers specified manually, and DNS seeds when AddrFetch is used as a fallback if DNS doesn't work for us.

The current behavior of getting peers via AddrFetch when starting with an empty addrman would be to connect to the peer, receive its self-announcement and add it to addrman, disconnect, reconnect to the same peer again as a full outbound (no other addresses in addrman) and then receive more addr. This is silly and not in line with AddrFetch peer being intended to be short-lived peers.

Fix this by only disconnecting after receiving an addr message of size > 1.

[Edit] As per review discussion, this PR now also adds a timeout after which we disconnect if we haven't received any suitable addr, and a functional test.

Backport of core#22096.

Ref T1696.

Test Plan:

ninja all check-all

Reviewers: #bitcoin_abc, PiRK

Reviewed By: #bitcoin_abc, PiRK

Maniphest Tasks: T1696

Differential Revision: https://reviews.bitcoinabc.org/D10925

Details

Provenance
Martin Zumsande <mzumsande@gmail.com>Authored on May 28 2021, 14:06
FabienCommitted on Jan 28 2022, 12:23
FabienPushed on Jan 28 2022, 12:23
Reviewer
Restricted Project
Differential Revision
D10925: p2p: AddrFetch - don't disconnect on self-announcements
Parents
rABCb98c847ec131: Cleanup of -debug=net log messages
Branches
Unknown
Tags
Unknown
Tasks
Restricted Maniphest Task

Event Timeline