diff --git a/p2p/host/routed/routed.go b/p2p/host/routed/routed.go index 92e77a599f6567edcc51827cf92bd82e1e9847f0..b37bf52a561b31c9ea2dcf5fe70838dce2d62e39 100644 --- a/p2p/host/routed/routed.go +++ b/p2p/host/routed/routed.go @@ -59,18 +59,12 @@ func (rh *RoutedHost) Connect(ctx context.Context, pi pstore.PeerInfo) error { // Check if we have some addresses in our recent memory. addrs := rh.Peerstore().Addrs(pi.ID) if len(addrs) < 1 { - // no addrs? find some with the routing system. - pi2, err := rh.route.FindPeer(ctx, pi.ID) + var err error + addrs, err = rh.findPeerAddrs(ctx, pi.ID) if err != nil { - return err // couldnt find any :( - } - if pi2.ID != pi.ID { - err = fmt.Errorf("routing failure: provided addrs for different peer") - logRoutingErrDifferentPeers(ctx, pi.ID, pi2.ID, err) return err } - addrs = pi2.Addrs } // if we're here, we got some addrs. let's use our wrapped host to connect. @@ -78,6 +72,21 @@ func (rh *RoutedHost) Connect(ctx context.Context, pi pstore.PeerInfo) error { return rh.host.Connect(ctx, pi) } +func (rh *RoutedHost) findPeerAddrs(ctx context.Context, id peer.ID) ([]ma.Multiaddr, error) { + pi, err := rh.route.FindPeer(ctx, id) + if err != nil { + return nil, err // couldnt find any :( + } + + if pi.ID != id { + err = fmt.Errorf("routing failure: provided addrs for different peer") + logRoutingErrDifferentPeers(ctx, id, pi.ID, err) + return nil, err + } + + return pi.Addrs, nil +} + func logRoutingErrDifferentPeers(ctx context.Context, wanted, got peer.ID, err error) { lm := make(lgbl.DeferredMap) lm["error"] = err @@ -119,6 +128,14 @@ func (rh *RoutedHost) RemoveStreamHandler(pid protocol.ID) { } func (rh *RoutedHost) NewStream(ctx context.Context, p peer.ID, pids ...protocol.ID) (inet.Stream, error) { + // Ensure we have a connection, with peer addresses resolved by the routing system (#207) + // It is not sufficient to let the underlying host connect, it will most likely not have + // any addresses for the peer without any prior connections. + err := rh.Connect(ctx, pstore.PeerInfo{ID: p}) + if err != nil { + return nil, err + } + return rh.host.NewStream(ctx, p, pids...) } func (rh *RoutedHost) Close() error {