diff --git a/cmd/qgb/common/helpers.go b/cmd/qgb/common/helpers.go index 34c7951d..004cd39e 100644 --- a/cmd/qgb/common/helpers.go +++ b/cmd/qgb/common/helpers.go @@ -168,7 +168,7 @@ func InitBase( // creating the p2p querier p2pQuerier := p2p.NewQuerier(dht, logger) - retrier := helpers.NewRetrier(logger, 5, 15*time.Second) + retrier := helpers.NewRetrier(logger, 6, time.Minute) return tmQuerier, appQuerier, p2pQuerier, retrier, s.EVMKeyStore, &acc, stopFuncs, nil } diff --git a/helpers/retrier.go b/helpers/retrier.go index 44fd7ee8..f6b1c52b 100644 --- a/helpers/retrier.go +++ b/helpers/retrier.go @@ -11,31 +11,31 @@ import ( type Retrier struct { logger tmlog.Logger retriesNumber int - delay time.Duration + baseDelay time.Duration } -// DefaultRetrierDelay default retrier delay +// DefaultRetrierDelay default retrier baseDelay const DefaultRetrierDelay = 10 * time.Second -func NewRetrier(logger tmlog.Logger, retriesNumber int, delay time.Duration) *Retrier { +func NewRetrier(logger tmlog.Logger, retriesNumber int, baseDelay time.Duration) *Retrier { return &Retrier{ logger: logger, retriesNumber: retriesNumber, - delay: delay, + baseDelay: baseDelay, } } -// Retry retries the `retryMethod` for `r.retriesNumber` times, separated by a delay equal to `r.delay`. +// Retry retries the `retryMethod` for `r.retriesNumber` times, separated by an exponential delay +// calculated using the `NextTick(retryCount)` method. // Returns the final execution error if all retries failed. func (r Retrier) Retry(ctx context.Context, retryMethod func() error) error { var err error - ticker := time.NewTicker(r.delay) for i := 0; i < r.retriesNumber; i++ { - // We can implement some exponential backoff in here + nextTick := time.NewTimer(r.NextTick(i)) select { case <-ctx.Done(): return ctx.Err() - case <-ticker.C: + case <-nextTick.C: r.logger.Info("retrying", "retry_number", i, "retries_left", r.retriesNumber-i) err = retryMethod() if err == nil { @@ -55,3 +55,9 @@ func (r Retrier) RetryThenFail(ctx context.Context, retryMethod func() error) { panic(err) } } + +// NextTick calculates the next exponential tick based on the provided retry count +// and the initialized base delay. +func (r Retrier) NextTick(retryCount int) time.Duration { + return 1 << retryCount * r.baseDelay +}