internal/offloading/options.go (46 lines of code) (raw):
package offloading
import (
"math/rand"
"time"
"gitlab.com/gitlab-org/gitaly/v16/internal/backoff"
)
var (
// defaultOverallTimeout is the default overall timeout for the sink.
defaultOverallTimeout = 1 * time.Minute
// defaultMaxRetry is the default max backoffStrategy for the sink.
defaultMaxRetry = uint(2)
// defaultRetryTimeout is the default backoffStrategy timeout for the sink.
defaultRetryTimeout = 15 * time.Second
// defaultBackoffStrategy is the default backoff strategy for the sink.
defaultBackoffStrategy = backoff.NewDefaultExponential(rand.New(rand.NewSource(time.Now().UnixNano())))
)
type sinkCfg struct {
overallTimeout time.Duration
maxRetry uint
noRetry bool
retryTimeout time.Duration
backoffStrategy backoff.Strategy
}
// SinkOption modifies a sink configuration.
type SinkOption func(*sinkCfg)
// WithOverallTimeout sets the overallTimeout.
// The overallTimeout specifies the maximum allowed duration for the entire operation,
// including all retries. This ensures the operation completes or fails within a bounded time.
func WithOverallTimeout(timeout time.Duration) SinkOption {
return func(s *sinkCfg) {
s.overallTimeout = timeout
}
}
// WithMaxRetry sets the max backoffStrategy attempt. Use WithNoRetry if you do not want any retry.
// If the operation supports retries, it will attempt the operation up to maxRetry times
// with retryTimeout intervals between each attempt. Once the overallTimeout is exceeded,
// the operation will be terminated even if maxRetry attempts not been exhausted.
func WithMaxRetry(max uint) SinkOption {
return func(s *sinkCfg) {
s.maxRetry = max
}
}
// WithNoRetry disables the backoffStrategy for the sink.
func WithNoRetry() SinkOption {
return func(s *sinkCfg) {
s.maxRetry = 0
s.noRetry = true
}
}
// WithRetryTimeout sets the retryTimeout.
// The retryTimeout specifies the maximum time to wait for each individual backoffStrategy attempt.
// This is useful for handling transient failures in a single operation while respecting
// the overall timeout.
func WithRetryTimeout(duration time.Duration) SinkOption {
return func(s *sinkCfg) {
s.retryTimeout = duration
}
}
// WithBackoffStrategy sets the backoff strategy for retrying failed operations.
func WithBackoffStrategy(strategy backoff.Strategy) SinkOption {
return func(s *sinkCfg) {
s.backoffStrategy = strategy
}
}