Skip to content

Instantly share code, notes, and snippets.

@xigang
Created October 12, 2019 03:19
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save xigang/1ee347385937c8707b9ccbd8758d9c95 to your computer and use it in GitHub Desktop.
Save xigang/1ee347385937c8707b9ccbd8758d9c95 to your computer and use it in GitHub Desktop.
retry.go
type ConditionFunc func() (bool, error)
// Retry retries f every interval until after maxRetries.
// The interval won't be affected by how long f takes.
// For example, if interval is 3s, f takes 1s, another f will be called 2s later.
// However, if f takes longer than interval, it will be delayed.
func Retry(interval time.Duration, maxRetries int, f ConditionFunc) error {
if maxRetries <= 0 {
return fmt.Errorf("maxRetries (%d) should be > 0", maxRetries)
}
tick := time.NewTicker(interval)
defer tick.Stop()
for i := 0; ; i++ {
ok, err := f()
if err != nil {
return err
}
if ok {
return nil
}
if i == maxRetries {
break
}
<-tick.C
}
return &RetryError{maxRetries}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment