@cryptotaxi247 / kubo / commits / 6b4664fc8

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