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
+}