|
- /*
- Copyright 2017 Google LLC
-
- Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License.
- You may obtain a copy of the License at
-
- http://www.apache.org/licenses/LICENSE-2.0
-
- Unless required by applicable law or agreed to in writing, software
- distributed under the License is distributed on an "AS IS" BASIS,
- WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- See the License for the specific language governing permissions and
- limitations under the License.
- */
-
- package backoff
-
- import (
- "math/rand"
- "time"
- )
-
- const (
- // minBackoff is the minimum backoff used by default.
- minBackoff = 20 * time.Millisecond
- // maxBackoff is the maximum backoff used by default.
- maxBackoff = 32 * time.Second
- // jitter is the jitter factor.
- jitter = 0.4
- // rate is the rate of exponential increase in the backoff.
- rate = 1.3
- )
-
- var DefaultBackoff = ExponentialBackoff{minBackoff, maxBackoff}
-
- type ExponentialBackoff struct {
- Min, Max time.Duration
- }
-
- // delay calculates the delay that should happen at n-th
- // exponential backoff in a series.
- func (b ExponentialBackoff) Delay(retries int) time.Duration {
- min, max := float64(b.Min), float64(b.Max)
- delay := min
- for delay < max && retries > 0 {
- delay *= rate
- retries--
- }
- if delay > max {
- delay = max
- }
- delay -= delay * jitter * rand.Float64()
- if delay < min {
- delay = min
- }
- return time.Duration(delay)
- }
|