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 }