09acefd2b3411ae9aab17afe9f117faeb6e48aad
The dialer-side supervisor dialed peers by bare EndpointId, forcing iroh to resolve the address through the gossip-fed MemoryLookup. A transient drop that also triggered a gossip Leave/NeighborDown purged the peer from that lookup, so the supervisor redialed forever with "no address" (observed in the 2026-05-30 field test: ~4.5 min of "No address lookup configured; retrying in 5s"). The transport now retains each peer's full EndpointAddr (relay + direct addrs), refreshed on join and on every re-announce (so a rejoin on a new address updates the dial target), and the dialer dials that retained address directly — which bypasses the lookup entirely. connect_peer now takes an EndpointAddr; core hands over state.addr on PeerJoined and PeerUpdated. New regression test dials and reconnects with the dialer's lookup deliberately empty and the relay disabled, so only the retained address can carry the dial: it passes with the fix and times out under the old bare-id behavior. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Releases
10
Languages
Rust
98.8%
Shell
0.4%
Nix
0.4%
Python
0.2%
Inno Setup
0.2%