Commit 4d1c7a91 authored by Jeromy Johnson's avatar Jeromy Johnson Committed by GitHub
Browse files

Merge pull request #91 from libp2p/fix/add-conn-setup-deadline

swarm: add deadline for connection setup
parents 4ae3510f 94417543
...@@ -2,6 +2,7 @@ package basichost ...@@ -2,6 +2,7 @@ package basichost
import ( import (
"io" "io"
"time"
peer "github.com/ipfs/go-libp2p-peer" peer "github.com/ipfs/go-libp2p-peer"
pstore "github.com/ipfs/go-libp2p-peerstore" pstore "github.com/ipfs/go-libp2p-peerstore"
...@@ -102,20 +103,29 @@ func (h *BasicHost) newConnHandler(c inet.Conn) { ...@@ -102,20 +103,29 @@ func (h *BasicHost) newConnHandler(c inet.Conn) {
// newStreamHandler is the remote-opened stream handler for inet.Network // newStreamHandler is the remote-opened stream handler for inet.Network
// TODO: this feels a bit wonky // TODO: this feels a bit wonky
func (h *BasicHost) newStreamHandler(s inet.Stream) { func (h *BasicHost) newStreamHandler(s inet.Stream) {
before := time.Now()
protoID, handle, err := h.Mux().Negotiate(s) protoID, handle, err := h.Mux().Negotiate(s)
took := time.Now().Sub(before)
if err != nil { if err != nil {
if err == io.EOF { if err == io.EOF {
log.Debugf("protocol EOF: %s", s.Conn().RemotePeer()) logf := log.Debugf
if took > time.Second*10 {
logf = log.Warningf
}
logf("protocol EOF: %s (took %s)", s.Conn().RemotePeer(), took)
} else { } else {
log.Warning("protocol mux failed: %s", err) log.Warning("protocol mux failed: %s (took %s)", err, took)
} }
return return
} }
s.SetProtocol(protocol.ID(protoID)) s.SetProtocol(protocol.ID(protoID))
logStream := mstream.WrapStream(s, h.bwc) if h.bwc != nil {
s = mstream.WrapStream(s, h.bwc)
}
log.Debugf("protocol negotiation took %s", took)
go handle(protoID, logStream) go handle(protoID, s)
} }
// ID returns the (local) peer.ID associated with this Host // ID returns the (local) peer.ID associated with this Host
......
...@@ -372,10 +372,21 @@ func (s *Swarm) dialAddr(ctx context.Context, p peer.ID, addr ma.Multiaddr) (con ...@@ -372,10 +372,21 @@ func (s *Swarm) dialAddr(ctx context.Context, p peer.ID, addr ma.Multiaddr) (con
return connC, nil return connC, nil
} }
var ConnSetupTimeout = time.Minute * 5
// dialConnSetup is the setup logic for a connection from the dial side. it // dialConnSetup is the setup logic for a connection from the dial side. it
// needs to add the Conn to the StreamSwarm, then run newConnSetup // needs to add the Conn to the StreamSwarm, then run newConnSetup
func dialConnSetup(ctx context.Context, s *Swarm, connC conn.Conn) (*Conn, error) { func dialConnSetup(ctx context.Context, s *Swarm, connC conn.Conn) (*Conn, error) {
deadline, ok := ctx.Deadline()
if !ok {
deadline = time.Now().Add(ConnSetupTimeout)
}
if err := connC.SetDeadline(deadline); err != nil {
return nil, err
}
psC, err := s.swarm.AddConn(connC) psC, err := s.swarm.AddConn(connC)
if err != nil { if err != nil {
// connC is closed by caller if we fail. // connC is closed by caller if we fail.
...@@ -389,5 +400,10 @@ func dialConnSetup(ctx context.Context, s *Swarm, connC conn.Conn) (*Conn, error ...@@ -389,5 +400,10 @@ func dialConnSetup(ctx context.Context, s *Swarm, connC conn.Conn) (*Conn, error
return nil, err return nil, err
} }
if err := connC.SetDeadline(time.Time{}); err != nil {
log.Error("failed to reset connection deadline after setup: ", err)
return nil, err
}
return swarmC, err return swarmC, err
} }
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment