1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
|
// Copyright 2016 Google LLC
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package gensupport
import (
"io"
"time"
)
// errReader reads out of a buffer until it is empty, then returns the specified error.
type errReader struct {
buf []byte
err error
}
func (er *errReader) Read(p []byte) (int, error) {
if len(er.buf) == 0 {
if er.err == nil {
return 0, io.EOF
}
return 0, er.err
}
n := copy(p, er.buf)
er.buf = er.buf[n:]
return n, nil
}
// UniformPauseStrategy implements BackoffStrategy with uniform pause.
type UniformPauseStrategy time.Duration
func (p UniformPauseStrategy) Pause() (time.Duration, bool) { return time.Duration(p), true }
func (p UniformPauseStrategy) Reset() {}
// NoPauseStrategy implements BackoffStrategy with infinite 0-length pauses.
const NoPauseStrategy = UniformPauseStrategy(0)
// LimitRetryStrategy wraps a BackoffStrategy but limits the number of retries.
type LimitRetryStrategy struct {
Max int
Strategy BackoffStrategy
n int
}
func (l *LimitRetryStrategy) Pause() (time.Duration, bool) {
l.n++
if l.n > l.Max {
return 0, false
}
return l.Strategy.Pause()
}
func (l *LimitRetryStrategy) Reset() {
l.n = 0
l.Strategy.Reset()
}
|