提交 8e6609e7 作者: Jeromy

add timeout opt to transport dialer creation

License: MIT
Signed-off-by: 's avatarJeromy <jeromyj@gmail.com>
上级 d26a9182
......@@ -4,7 +4,6 @@ import (
"fmt"
"math/rand"
"strings"
"time"
ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
manet "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net"
......@@ -19,7 +18,7 @@ import (
type WrapFunc func(transport.Conn) transport.Conn
func NewDialer(p peer.ID, pk ci.PrivKey, tout time.Duration, wrap WrapFunc) *Dialer {
func NewDialer(p peer.ID, pk ci.PrivKey, wrap WrapFunc) *Dialer {
return &Dialer{
LocalPeer: p,
PrivateKey: pk,
......
......@@ -103,7 +103,7 @@ func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr,
bwc: bwc,
fdRateLimit: make(chan struct{}, concurrentFdDials),
Filters: filter.NewFilters(),
dialer: conn.NewDialer(local, peers.PrivKey(local), DialTimeout, wrap),
dialer: conn.NewDialer(local, peers.PrivKey(local), wrap),
}
// configure Swarm
......
......@@ -22,7 +22,7 @@ func (s *Swarm) setupAddresses(addrs []ma.Multiaddr) error {
return fmt.Errorf("no transport for address: %s", a)
}
d, err := tpt.Dialer(a)
d, err := tpt.Dialer(a, transport.TimeoutOpt(DialTimeout))
if err != nil {
return err
}
......
package transport
import (
"fmt"
"net"
"sync"
"time"
ma "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr"
manet "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multiaddr-net"
......@@ -26,7 +28,7 @@ func NewTCPTransport() *TcpTransport {
}
}
func (t *TcpTransport) Dialer(laddr ma.Multiaddr) (Dialer, error) {
func (t *TcpTransport) Dialer(laddr ma.Multiaddr, opts ...DialOpt) (Dialer, error) {
t.dlock.Lock()
defer t.dlock.Unlock()
s := laddr.String()
......@@ -34,8 +36,17 @@ func (t *TcpTransport) Dialer(laddr ma.Multiaddr) (Dialer, error) {
if found {
return d, nil
}
var base manet.Dialer
for _, o := range opts {
switch o := o.(type) {
case TimeoutOpt:
base.Timeout = o.(time.Duration)
default:
return nil, fmt.Errorf("unrecognized option: %#v", o)
}
}
tcpd, err := t.newTcpDialer(base, laddr)
if err != nil {
return nil, err
......@@ -119,10 +130,17 @@ func (t *TcpTransport) newTcpDialer(base manet.Dialer, laddr ma.Multiaddr) (*tcp
}, nil
}
rd := reuseport.Dialer{
D: net.Dialer{
LocalAddr: la,
Timeout: base.Timeout,
},
}
return &tcpDialer{
doReuse: true,
laddr: laddr,
rd: reuseport.Dialer{D: net.Dialer{LocalAddr: la}},
rd: rd,
madialer: base,
transport: t,
}, nil
......
......@@ -17,7 +17,7 @@ type Conn interface {
}
type Transport interface {
Dialer(laddr ma.Multiaddr) (Dialer, error)
Dialer(laddr ma.Multiaddr, opts ...DialOpt) (Dialer, error)
Listener(laddr ma.Multiaddr) (Listener, error)
Matches(ma.Multiaddr) bool
}
......@@ -43,6 +43,9 @@ func (cw *connWrap) Transport() Transport {
return cw.transport
}
type DialOpt interface{}
type TimeoutOpt interface{}
func IsTcpMultiaddr(a ma.Multiaddr) bool {
p := a.Protocols()
return len(p) == 2 && (p[0].Name == "ip4" || p[0].Name == "ip6") && p[1].Name == "tcp"
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论