bitbucket.org/ai69/amoy@v0.2.3/retry.go (about)

     1  package amoy
     2  
     3  import (
     4  	"time"
     5  
     6  	rg "github.com/avast/retry-go"
     7  )
     8  
     9  var (
    10  	alwaysTrueFunc  = func(_ error) bool { return true }
    11  	alwaysFalseFunc = func(_ error) bool { return false }
    12  )
    13  
    14  // RetryIfFunc represents function signature of retry if function.
    15  type RetryIfFunc func(error) bool
    16  
    17  // SimpleRetry retries to execute given function for 3 times and with exponential backoff delay starting at 300ms.
    18  func SimpleRetry(work func() error) error {
    19  	return BackOffRetryIf(work, alwaysTrueFunc, 3, 300*time.Millisecond)
    20  }
    21  
    22  // BackOffRetry retries to execute given function with exponential backoff delay.
    23  func BackOffRetry(work func() error, times uint, delay time.Duration) error {
    24  	return BackOffRetryIf(work, alwaysTrueFunc, times, delay)
    25  }
    26  
    27  // BackOffRetryIf retries to execute given function with exponential backoff delay if condition meets.
    28  func BackOffRetryIf(work func() error, retryIf RetryIfFunc, times uint, delay time.Duration) error {
    29  	return rg.Do(
    30  		work,
    31  		rg.RetryIf(rg.RetryIfFunc(retryIf)),
    32  		rg.Attempts(times),
    33  		rg.DelayType(rg.BackOffDelay),
    34  		rg.Delay(delay),
    35  		rg.MaxDelay(10*time.Second),
    36  		rg.MaxJitter(time.Duration(float64(delay)*0.2)),
    37  		rg.LastErrorOnly(true),
    38  	)
    39  }
    40  
    41  // FixedRetry retries to execute given function with consistent same delay.
    42  func FixedRetry(work func() error, times uint, delay time.Duration) error {
    43  	return FixedRetryIf(work, alwaysTrueFunc, times, delay)
    44  }
    45  
    46  // FixedRetryIf retries to execute given function with consistent same delay if condition meets.
    47  func FixedRetryIf(work func() error, retryIf RetryIfFunc, times uint, delay time.Duration) error {
    48  	return rg.Do(
    49  		work,
    50  		rg.RetryIf(rg.RetryIfFunc(retryIf)),
    51  		rg.Attempts(times),
    52  		rg.DelayType(rg.FixedDelay),
    53  		rg.Delay(delay),
    54  		rg.LastErrorOnly(true),
    55  	)
    56  }