diff --git a/p2p/net/swarm/swarm.go b/p2p/net/swarm/swarm.go index 02cff1e881..0127555552 100644 --- a/p2p/net/swarm/swarm.go +++ b/p2p/net/swarm/swarm.go @@ -32,6 +32,8 @@ const ( // This includes the time between dialing the raw network connection, // protocol selection as well the handshake, if applicable. defaultDialTimeoutLocal = 5 * time.Second + + defaultNewStreamTimeout = 15 * time.Second ) var log = logging.Logger("swarm2") diff --git a/p2p/net/swarm/swarm_conn.go b/p2p/net/swarm/swarm_conn.go index 38e942cce8..5fd41c8d9f 100644 --- a/p2p/net/swarm/swarm_conn.go +++ b/p2p/net/swarm/swarm_conn.go @@ -209,9 +209,18 @@ func (c *Conn) NewStream(ctx context.Context) (network.Stream, error) { return nil, err } + if _, ok := ctx.Deadline(); !ok { + var cancel context.CancelFunc + ctx, cancel = context.WithTimeout(ctx, defaultNewStreamTimeout) + defer cancel() + } + s, err := c.openAndAddStream(ctx, scope) if err != nil { scope.Done() + if errors.Is(err, context.DeadlineExceeded) { + err = fmt.Errorf("timed out: %w", err) + } return nil, err } return s, nil