You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
46 lines
1.2 KiB
// Copyright 2016 The Go Authors. All rights reserved. |
|
// Use of this source code is governed by a BSD-style |
|
// license that can be found in the LICENSE file. |
|
|
|
package gensupport |
|
|
|
import ( |
|
"math/rand" |
|
"time" |
|
) |
|
|
|
type BackoffStrategy interface { |
|
// Pause returns the duration of the next pause and true if the operation should be |
|
// retried, or false if no further retries should be attempted. |
|
Pause() (time.Duration, bool) |
|
|
|
// Reset restores the strategy to its initial state. |
|
Reset() |
|
} |
|
|
|
// ExponentialBackoff performs exponential backoff as per https://en.wikipedia.org/wiki/Exponential_backoff. |
|
// The initial pause time is given by Base. |
|
// Once the total pause time exceeds Max, Pause will indicate no further retries. |
|
type ExponentialBackoff struct { |
|
Base time.Duration |
|
Max time.Duration |
|
total time.Duration |
|
n uint |
|
} |
|
|
|
func (eb *ExponentialBackoff) Pause() (time.Duration, bool) { |
|
if eb.total > eb.Max { |
|
return 0, false |
|
} |
|
|
|
// The next pause is selected from randomly from [0, 2^n * Base). |
|
d := time.Duration(rand.Int63n((1 << eb.n) * int64(eb.Base))) |
|
eb.total += d |
|
eb.n++ |
|
return d, true |
|
} |
|
|
|
func (eb *ExponentialBackoff) Reset() { |
|
eb.n = 0 |
|
eb.total = 0 |
|
}
|
|
|