fix(relay): feed connected peers to AutoRelay discovery (#10901)
* fix(relay): feed connected peers to AutoRelay discovery Feed all connected swarm peers to AutoRelay as potential relay candidates. This allows peers from HTTP routing and manual connections to serve as relays, not just DHT-discovered peers. Fixes #10899 * docs: changelog
Marcin Rataj committed
Aug 11, 2025 at 23:59 UTC
c513e1adfa94f0c5c2b174935ec1ab6da41200c6
2 files changed
+29
-12
core/node/libp2p/routing.go
+24
-12
@@ -297,24 +297,36 @@ func autoRelayFeeder(cfgPeering config.Peering, peerChan chan<- peer.AddrInfo) f
297
}
298
299
// Additionally, feed closest peers discovered via DHT
300
- if dht == nil {
301
- /* noop due to missing dht.WAN. happens in some unit tests,
302
- not worth fixing as we will refactor this after go-libp2p 0.20 */
303
- continue
304
- }
305
- closestPeers, err := dht.WAN.GetClosestPeers(ctx, h.ID().String())
306
- if err != nil {
307
- // no-op: usually 'failed to find any peer in table' during startup
308
- continue
300
+ if dht != nil {
301
+ closestPeers, err := dht.WAN.GetClosestPeers(ctx, h.ID().String())
302
+ if err == nil {
303
+ for _, p := range closestPeers {
304
+ addrs := h.Peerstore().Addrs(p)
305
+ if len(addrs) == 0 {
306
+ continue
307
+ }
308
+ dhtPeer := peer.AddrInfo{ID: p, Addrs: addrs}
309
+ select {
310
+ case peerChan <- dhtPeer:
311
+ case <-ctx.Done():
312
+ return
313
+ }
314
+ }
315
+ }
316
}
310
- for _, p := range closestPeers {
317
+
318
+ // Additionally, feed all connected swarm peers as potential relay candidates.
319
+ // This includes peers from HTTP routing, manual swarm connect, mDNS discovery, etc.
320
+ // (fixes https://github.com/ipfs/kubo/issues/10899)
321
+ connectedPeers := h.Network().Peers()
322
+ for _, p := range connectedPeers {
323
addrs := h.Peerstore().Addrs(p)
324
if len(addrs) == 0 {
325
continue
326
}
315
- dhtPeer := peer.AddrInfo{ID: p, Addrs: addrs}
327
+ swarmPeer := peer.AddrInfo{ID: p, Addrs: addrs}
328
select {
317
- case peerChan <- dhtPeer:
329
+ case peerChan <- swarmPeer:
330
case <-ctx.Done():
331
return
332
}
docs/changelogs/v0.37.md
+5
@@ -16,6 +16,7 @@ This release was brought to you by the [Shipyard](https://ipshipyard.com/) team.
16
- [⚙️ `Reprovider.Strategy` is now consistently respected](#-reprovider-strategy-is-now-consistently-respected)
17
- [Removed unnecessary dependencies](#removed-unnecessary-dependencies)
18
- [Deprecated `ipfs stats reprovide`](#deprecated-ipfs-stats-reprovide)
19
+ - [🔄 AutoRelay now uses all connected peers for relay discovery](#-autorelay-now-uses-all-connected-peers-for-relay-discovery)
20
- [📦️ Important dependency updates](#-important-dependency-updates)
21
- [📝 Changelog](#-changelog)
22
- [👨👩👧👦 Contributors](#-contributors)
@@ -105,6 +106,10 @@ The `ipfs stats reprovide` command has moved to `ipfs provide stat`. This was do
106
> [!NOTE]
107
> `ipfs stats reprovide` still works, but is marked as deprecated and will be removed in a future release.
108
109
+#### 🔄 AutoRelay now uses all connected peers for relay discovery
110
+
111
+AutoRelay's relay discovery now includes all connected peers as potential relay candidates, not just peers discovered through the DHT. This allows peers connected via HTTP routing and manual `ipfs swarm connect` commands to serve as relays, improving connectivity for nodes using non-DHT routing configurations.
112
+
113
#### 📦️ Important dependency updates
114
115
- update `go-libp2p` to [v0.43.0](https://github.com/libp2p/go-libp2p/releases/tag/v0.43.0) (incl. [v0.42.1](https://github.com/libp2p/go-libp2p/releases/tag/v0.42.1))