mirror of
https://github.com/mattermost/mattermost.git
synced 2026-02-03 20:40:00 -05:00
36 lines
1.1 KiB
Go
36 lines
1.1 KiB
Go
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
|
|
// See LICENSE.txt for license information.
|
|
|
|
package utils
|
|
|
|
import (
|
|
"time"
|
|
)
|
|
|
|
var shortBackoffTimeouts = []time.Duration{50 * time.Millisecond, 100 * time.Millisecond, 200 * time.Millisecond, 200 * time.Millisecond, 400 * time.Millisecond, 400 * time.Millisecond}
|
|
|
|
var longBackoffTimeouts = []time.Duration{500 * time.Millisecond, 1 * time.Second, 2 * time.Second, 5 * time.Second, 8 * time.Second, 10 * time.Second}
|
|
|
|
// ProgressiveRetry executes a BackoffOperation and waits an increasing time before retrying the operation.
|
|
func ProgressiveRetry(operation func() error) error {
|
|
return CustomProgressiveRetry(operation, shortBackoffTimeouts)
|
|
}
|
|
|
|
func LongProgressiveRetry(operation func() error) error {
|
|
return CustomProgressiveRetry(operation, longBackoffTimeouts)
|
|
}
|
|
|
|
func CustomProgressiveRetry(operation func() error, backoffTimeouts []time.Duration) error {
|
|
var err error
|
|
|
|
for attempts := range backoffTimeouts {
|
|
err = operation()
|
|
if err == nil {
|
|
return nil
|
|
}
|
|
|
|
time.Sleep(backoffTimeouts[attempts])
|
|
}
|
|
|
|
return err
|
|
}
|