@cryptotaxi247 / kubo / commits / 223a97f3f

p2p/net/conn: only reuseport if avail

Juan Batiz-Benet committed Jan 20, 2015 at 19:46 UTC 223a97f3f8a1e471de37a756d1096b27cfb07a00
2 files changed +22 -15
p2p/net/conn/dial.go
+1 -1
@@ -89,7 +89,7 @@ func (d *Dialer) rawConnDial(ctx context.Context, raddr ma.Multiaddr, remote pee
89 laddr := pickLocalAddr(d.LocalAddrs, raddr)
90 log.Debugf("%s dialing %s -- %s --> %s", d.LocalPeer, remote, laddr, raddr)
91
92 - if laddr != nil {
92 + if laddr != nil && reuseport.Available() {
93 // dial using reuseport.Dialer, because we're probably reusing addrs.
94 // this is optimistic, as the reuseDial may fail to bind the port.
95 if nconn, retry, reuseErr := d.reuseDial(laddr, raddr); reuseErr == nil {
p2p/net/conn/listen.go
+21 -14
@@ -124,20 +124,7 @@ func (l *listener) Loggable() map[string]interface{} {
124
125 // Listen listens on the particular multiaddr, with given peer and peerstore.
126 func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey) (Listener, error) {
127 -
128 - network, naddr, err := manet.DialArgs(addr)
129 - if err != nil {
130 - return nil, err
131 - }
132 -
133 - // _ := reuseport.Listen
134 - // ml, err := manet.Listen(addr)
135 - nl, err := reuseport.Listen(network, naddr)
136 - if err != nil {
137 - return nil, fmt.Errorf("Failed to listen on %s: %s", addr, err)
138 - }
139 -
140 - ml, err := manet.WrapNetListener(nl)
127 + ml, err := manetListen(addr)
128 if err != nil {
129 return nil, err
130 }
@@ -154,3 +141,23 @@ func Listen(ctx context.Context, addr ma.Multiaddr, local peer.ID, sk ic.PrivKey
141 log.Event(ctx, "swarmListen", l)
142 return l, nil
143 }
144 +
145 +func manetListen(addr ma.Multiaddr) (manet.Listener, error) {
146 + network, naddr, err := manet.DialArgs(addr)
147 + if err != nil {
148 + return nil, err
149 + }
150 +
151 + if reuseport.Available() {
152 + nl, err := reuseport.Listen(network, naddr)
153 + if err == nil {
154 + // hey, it worked!
155 + return manet.WrapNetListener(nl)
156 + }
157 + // reuseport is available, but we failed to listen. log debug, and retry normally.
158 + log.Debugf("reuseport available, but failed to listen: %s %s, %s", network, naddr, err)
159 + }
160 +
161 + // either reuseport not available, or it failed. try normally.
162 + return manet.Listen(addr)
163 +}