1
0
mirror of https://github.com/ipfs/kubo.git synced 2025-06-26 23:53:19 +08:00

reuseport tcp is now a dial creation option

And other assorted PR feedback

License: MIT
Signed-off-by: Jeromy <jeromyj@gmail.com>
This commit is contained in:
Jeromy
2015-11-08 11:04:37 -08:00
parent 8e6609e78a
commit 724e6cb37d
5 changed files with 30 additions and 23 deletions

View File

@ -54,7 +54,7 @@ func setupSingleConn(t *testing.T, ctx context.Context) (a, b Conn, p1, p2 tu.Pe
}
func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey) (Listener, error) {
list, err := transport.NewTCPTransport().Listener(addr)
list, err := transport.NewTCPTransport().Listen(addr)
if err != nil {
return nil, err
}

View File

@ -114,7 +114,7 @@ func NewSwarm(ctx context.Context, listenAddrs []ma.Multiaddr,
prom.MustRegisterOrGet(peersTotal)
s.Notify((*metricsNotifiee)(s))
return s, s.setupAddresses(listenAddrs)
return s, s.setupInterfaces(listenAddrs)
}
func (s *Swarm) teardown() error {
@ -147,7 +147,7 @@ func (s *Swarm) Listen(addrs ...ma.Multiaddr) error {
return err
}
return s.setupAddresses(addrs)
return s.setupInterfaces(addrs)
}
// Process returns the Process of the swarm

View File

@ -15,21 +15,21 @@ import (
)
// Open listeners and reuse-dialers for the given addresses
func (s *Swarm) setupAddresses(addrs []ma.Multiaddr) error {
func (s *Swarm) setupInterfaces(addrs []ma.Multiaddr) error {
for _, a := range addrs {
tpt := s.transportForAddr(a)
if tpt == nil {
return fmt.Errorf("no transport for address: %s", a)
}
d, err := tpt.Dialer(a, transport.TimeoutOpt(DialTimeout))
d, err := tpt.Dialer(a, transport.TimeoutOpt(DialTimeout), transport.ReusePorts)
if err != nil {
return err
}
s.dialer.AddDialer(d)
list, err := tpt.Listener(a)
list, err := tpt.Listen(a)
if err != nil {
return err
}

View File

@ -38,16 +38,19 @@ func (t *TcpTransport) Dialer(laddr ma.Multiaddr, opts ...DialOpt) (Dialer, erro
}
var base manet.Dialer
var doReuse bool
for _, o := range opts {
switch o := o.(type) {
case TimeoutOpt:
base.Timeout = o.(time.Duration)
base.Timeout = time.Duration(o)
case ReuseportOpt:
doReuse = bool(o)
default:
return nil, fmt.Errorf("unrecognized option: %#v", o)
}
}
tcpd, err := t.newTcpDialer(base, laddr)
tcpd, err := t.newTcpDialer(base, laddr, doReuse)
if err != nil {
return nil, err
}
@ -56,7 +59,7 @@ func (t *TcpTransport) Dialer(laddr ma.Multiaddr, opts ...DialOpt) (Dialer, erro
return tcpd, nil
}
func (t *TcpTransport) Listener(laddr ma.Multiaddr) (Listener, error) {
func (t *TcpTransport) Listen(laddr ma.Multiaddr) (Listener, error) {
t.llock.Lock()
defer t.llock.Unlock()
s := laddr.String()
@ -114,33 +117,33 @@ type tcpDialer struct {
transport Transport
}
func (t *TcpTransport) newTcpDialer(base manet.Dialer, laddr ma.Multiaddr) (*tcpDialer, error) {
func (t *TcpTransport) newTcpDialer(base manet.Dialer, laddr ma.Multiaddr, doReuse bool) (*tcpDialer, error) {
// get the local net.Addr manually
la, err := manet.ToNetAddr(laddr)
if err != nil {
return nil, err // something wrong with laddr.
}
if !ReuseportIsAvailable() {
if doReuse && ReuseportIsAvailable() {
rd := reuseport.Dialer{
D: net.Dialer{
LocalAddr: la,
Timeout: base.Timeout,
},
}
return &tcpDialer{
doReuse: false,
doReuse: true,
laddr: laddr,
rd: rd,
madialer: base,
transport: t,
}, nil
}
rd := reuseport.Dialer{
D: net.Dialer{
LocalAddr: la,
Timeout: base.Timeout,
},
}
return &tcpDialer{
doReuse: true,
doReuse: false,
laddr: laddr,
rd: rd,
madialer: base,
transport: t,
}, nil

View File

@ -2,6 +2,7 @@ package transport
import (
"net"
"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"
@ -18,7 +19,7 @@ type Conn interface {
type Transport interface {
Dialer(laddr ma.Multiaddr, opts ...DialOpt) (Dialer, error)
Listener(laddr ma.Multiaddr) (Listener, error)
Listen(laddr ma.Multiaddr) (Listener, error)
Matches(ma.Multiaddr) bool
}
@ -44,7 +45,10 @@ func (cw *connWrap) Transport() Transport {
}
type DialOpt interface{}
type TimeoutOpt interface{}
type TimeoutOpt time.Duration
type ReuseportOpt bool
var ReusePorts ReuseportOpt = true
func IsTcpMultiaddr(a ma.Multiaddr) bool {
p := a.Protocols()