diff --git a/swarm.go b/swarm.go index 7a241b4b69495c35f9a7f3e4729088aa9e436d98..3b3cf832280256fb865266218633ed90c04f0c94 100644 --- a/swarm.go +++ b/swarm.go @@ -439,6 +439,17 @@ func (s *Swarm) bestConnToPeer(p peer.ID) *Conn { return best } +func (s *Swarm) bestAcceptableConnToPeer(ctx context.Context, p peer.ID) *Conn { + conn := s.bestConnToPeer(p) + if conn != nil { + forceDirect, _ := network.GetForceDirectDial(ctx) + if !forceDirect || isDirectConn(conn) { + return conn + } + } + return nil +} + func isDirectConn(c *Conn) bool { return c != nil && !c.conn.Transport().Proxy() } diff --git a/swarm_dial.go b/swarm_dial.go index 052da67fe54ab41ca77f98c943e533b1484552f9..ccf33c2e4c2c21fbd6acca1a9378d74e764f48dc 100644 --- a/swarm_dial.go +++ b/swarm_dial.go @@ -251,14 +251,9 @@ func (s *Swarm) dialPeer(ctx context.Context, p peer.ID) (*Conn, error) { defer log.EventBegin(ctx, "swarmDialAttemptSync", p).Done() - conn := s.bestConnToPeer(p) - forceDirect, _ := network.GetForceDirectDial(ctx) - if forceDirect { - if isDirectConn(conn) { - return conn, nil - } - } else if conn != nil { - // check if we already have an open connection first + // check if we already have an open (usable) connection first + conn := s.bestAcceptableConnToPeer(ctx, p) + if conn != nil { return conn, nil } @@ -292,13 +287,8 @@ func (s *Swarm) doDial(ctx context.Context, p peer.ID) (*Conn, error) { // Short circuit. // By the time we take the dial lock, we may already *have* a connection // to the peer. - forceDirect, _ := network.GetForceDirectDial(ctx) - c := s.bestConnToPeer(p) - if forceDirect { - if isDirectConn(c) { - return c, nil - } - } else if c != nil { + c := s.bestAcceptableConnToPeer(ctx, p) + if c != nil { return c, nil } @@ -310,13 +300,8 @@ func (s *Swarm) doDial(ctx context.Context, p peer.ID) (*Conn, error) { conn, err := s.dial(ctx, p) if err != nil { - conn = s.bestConnToPeer(p) - if forceDirect { - if isDirectConn(conn) { - log.Debugf("ignoring dial error because we already have a direct connection: %s", err) - return conn, nil - } - } else if conn != nil { + conn := s.bestAcceptableConnToPeer(ctx, p) + if conn != nil { // Hm? What error? // Could have canceled the dial because we received a // connection or some other random reason.