38 lines
1.1 KiB
Go
38 lines
1.1 KiB
Go
package utils
|
|
|
|
import (
|
|
"alfred/pkg/log"
|
|
"errors"
|
|
"go.uber.org/zap"
|
|
"time"
|
|
)
|
|
|
|
func RetryFunctionWithResponseAndError(fn func() (interface{}, error), maxRetries int, initialDelay time.Duration) (interface{}, error) {
|
|
var response interface{}
|
|
var err error
|
|
for retry := 0; retry < maxRetries; retry++ {
|
|
if response, err = fn(); err == nil {
|
|
return response, nil // Operation succeeded.
|
|
}
|
|
log.Error("Error while retrying", zap.Error(err))
|
|
// Calculate the delay using exponential backoff.
|
|
delay := initialDelay * (1 << uint(retry))
|
|
time.Sleep(delay)
|
|
}
|
|
return nil, errors.New("retry with error and response failed")
|
|
}
|
|
|
|
func RetryFunctionWithError(fn func() error, maxRetries int, initialDelay time.Duration) error {
|
|
var err error
|
|
for retry := 0; retry < maxRetries; retry++ {
|
|
if err = fn(); err == nil {
|
|
return nil // Operation succeeded.
|
|
}
|
|
log.Error("Error while retrying", zap.Error(err))
|
|
// Calculate the delay using exponential backoff.
|
|
delay := initialDelay * (1 << uint(retry))
|
|
time.Sleep(delay)
|
|
}
|
|
return errors.New("retry with error failed")
|
|
}
|