/go-retry

golang retry lib

Primary LanguageGoApache License 2.0Apache-2.0

retry

retry func, ensure call finish. support retry count、timeout、context.

  • each delay time
  • backoff
  • timeout
  • times
  • context
  • recovery

Usage

example

package main

import (
	"errors"
	"log"

	"github.com/rfyiamcool/go-retry"
)

func main() {
	r := retry.New()
	var running = false
	err := r.Ensure(func() error {
		if !running {
			log.Println("to retry")
			running = true
			return retry.Retriable(errors.New("diy"))
		}

		log.Println("ok")
		return nil
	})
	if err != nil {
		log.Fatal(err)
	}
}

more usage

usage from retry_test.go

func

  • Ensure
  • EnsureRetryTimes

options

  • WithBaseDelay
  • WithBackoff
  • WithRecovery
  • WithCtx
func TestBase(t *testing.T) {
	r := New(WithRecovery(), WithBaseDelay(100*time.Millisecond))
	err := r.EnsureRetryTimes(10, func() error {
		fmt.Println(time.Now())
		return Retriable(errors.New("haha"))
	})
	assert.ErrorContains(t, err, "haha")
}

func TestCtx(t *testing.T) {
	ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
	defer cancel()

	r := New(WithCtx(ctx))
	err := r.Ensure(func() error {
		t.Log(time.Now())
		return RetriableMesg("haha")
	})
	assert.Equal(t, err, ctx.Err())
}

func TestBackoff(t *testing.T) {
	bo := &Backoff{
		MinDelay: time.Duration(10 * time.Millisecond),
		MaxDelay: time.Duration(1 * time.Second),
		Factor:   2,
	}
	r := New(WithRecovery(), WithBaseDelay(100*time.Millisecond), WithBackoff(bo))
	err := r.EnsureRetryTimes(20, func() error {
		fmt.Println(time.Now())
		return Retriable(errors.New("haha"))
	})
	assert.ErrorContains(t, err, "haha")
}

func TestPanic(t *testing.T) {
	r := New(WithRecovery())
	err := r.Ensure(func() error {
		if 1 > 0 {
			panic("haha")
		}
		return nil
	})
	assert.ErrorContains(t, err, "haha")
}