Skip to content

arsham/retry

Repository files navigation

Retry

License GitHub go.mod Go version go.dev reference Build Status Coverage Status Go Report Card

This library supports Go >= 1.22 by getting github.com/arsham/retry/v3. For older versions (Go >= 1.20) import github.com/arsham/retry/v2, or older Go versions import github.com/arsham/retry.

Retry calls your function, and if it errors it calls it again with a delay. Eventually it returns the last error or nil if one call is successful.

r := &retry.Retry{
	Attempts: 666,
	Delay:    time.Millisecond,
}
err := r.Do(func() error {
	// do some work.
	return nil
})

You can provide multiple functions:

err := r.Do(func() error {
    return nil
}, func() error {
    return nil
}}

You can use the DoContext and pass a context object to stop when the context is cancelled:

err := r.DoContext(ctx, func() error {
	return nil
})

If you want to stop retrying you can return a special error:

err := r.Do(func() error {
	if specialCase {
		return &retry.StopError{
			Err: errors.New("a special stop"),
		}
	}
	return nil
})

The standard behaviour is to delay the amount you set. You can pass any function with this signature to change the delay behaviour:

func(attempt int, delay time.Duration) time.Duration

You can also pass the retry.IncrementalDelay function that would increase the delay with a jitter to prevent Thundering herd.

r := &retry.Retry{
	Attempts: 666,
	Delay:    10 * time.Millisecond,
	Method:   retry.IncrementalDelay,
}
err := r.Do(func() error {
	if specialCase {
		return &retry.StopError{
			Err: errors.New("a special stop"),
		}
	}
	return nil
})

License

Use of this source code is governed by the Apache 2.0 license. License can be found in the LICENSE file.