diff --git a/swarm_dial.go b/swarm_dial.go index 2b7f0b03e94ffa99c2a25e9bdef9d7030ae770e0..de16ba3fbb6f3c345ab174045417f126f269ee39 100644 --- a/swarm_dial.go +++ b/swarm_dial.go @@ -361,9 +361,16 @@ func (s *Swarm) dialWorkerLoop(ctx context.Context, p peer.ID, reqch <-chan Dial } var triggerDial <-chan time.Time + var triggerTimer *time.Timer triggerNow := make(chan time.Time) close(triggerNow) + defer func() { + if triggerTimer != nil { + triggerTimer.Stop() + } + }() + var nextDial []ma.Multiaddr active := 0 done := false @@ -504,7 +511,15 @@ loop: // select an appropriate delay for the next dial batch delay := s.delayForNextDial(lastDial) - triggerDial = time.After(delay) + if triggerTimer == nil { + triggerTimer = time.NewTimer(delay) + } else { + if !triggerTimer.Stop() && triggerDial != triggerTimer.C { + <-triggerTimer.C + } + triggerTimer.Reset(delay) + } + triggerDial = triggerTimer.C case res := <-resch: active--