p2p/net/swarm: permute addrs in rate limited dials
so that we dont get stuck dialing bad addrs first always.
Juan Batiz-Benet committed
Feb 2, 2015 at 12:05 UTC
6b4664fc8bf1740e2936e24449e353aeee3f4f39
1 file changed
+6
-2
p2p/net/swarm/swarm_dial.go
+6
-2
@@ -3,6 +3,7 @@ package swarm
3
import (
4
"errors"
5
"fmt"
6
+ "math/rand"
7
"net"
8
"sync"
9
"time"
@@ -384,13 +385,16 @@ func (s *Swarm) dialAddrs(ctx context.Context, d *conn.Dialer, p peer.ID, remote
385
go func() {
386
// rate limiting just in case. at most 10 addrs at once.
387
limiter := ratelimit.NewRateLimiter(procctx.WithContext(ctx), 10)
387
- for _, addr := range remoteAddrs {
388
+
389
+ // permute addrs so we try different sets first each time.
390
+ for _, i := range rand.Perm(len(remoteAddrs)) {
391
select {
392
case <-foundConn: // if one of them succeeded already
393
break
394
default:
395
}
393
- workerAddr := addr // shadow variable to avoid race
396
+
397
+ workerAddr := remoteAddrs[i] // shadow variable to avoid race
398
limiter.Go(func(worker process.Process) {
399
dialSingleAddr(workerAddr)
400
})