mirror of
https://github.com/open-policy-agent/opa.git
synced 2026-08-25 09:45:14 -06:00
f746d8caa9
* plugin/bundle: Correct bundle delay behavior I ran into an issue when testing an earlier change: https://github.com/open-policy-agent/opa/actions/runs/16646981900/job/47110035165 I found that this test generated around 100,000 lines of errors showing the bundle downloader running. This can be be tested using: ``` go test -v ./v1/plugins/bundle -count=1 2>&1 | grep -c "request failed" ``` This commit closes managers and plugins correctly. Signed-off-by: Charlie Egan <charlie@styra.com> * download: Update stop to be idempotent I had some race detector issues with TestStartStopWithLongPollNotSupported https://github.com/open-policy-agent/opa/actions/runs/16722869930/job/47334690407?pr=7812 I think this is a deadlock around multiple calls to Stop dead locking updating the stopped var. Signed-off-by: Charlie Egan <charlie@styra.com> --------- Signed-off-by: Charlie Egan <charlie@styra.com>
45 lines
1.1 KiB
Go
45 lines
1.1 KiB
Go
// Copyright 2018 The OPA Authors. All rights reserved.
|
|
// Use of this source code is governed by an Apache2
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package util
|
|
|
|
import (
|
|
"math/rand"
|
|
"time"
|
|
)
|
|
|
|
// DefaultBackoff returns a delay with an exponential backoff based on the
|
|
// number of retries.
|
|
func DefaultBackoff(base, maxNS float64, retries int) time.Duration {
|
|
return Backoff(base, maxNS, .2, 1.6, retries)
|
|
}
|
|
|
|
// Backoff returns a delay with an exponential backoff based on the number of
|
|
// retries. Same algorithm used in gRPC.
|
|
// Note that if maxNS is smaller than base, the backoff will still be capped at
|
|
// maxNS.
|
|
func Backoff(base, maxNS, jitter, factor float64, retries int) time.Duration {
|
|
if retries == 0 {
|
|
return 0
|
|
}
|
|
|
|
backoff, maxNS := base, maxNS
|
|
for backoff < maxNS && retries > 0 {
|
|
backoff *= factor
|
|
retries--
|
|
}
|
|
if backoff > maxNS {
|
|
backoff = maxNS
|
|
}
|
|
|
|
// Randomize backoff delays so that if a cluster of requests start at
|
|
// the same time, they won't operate in lockstep.
|
|
backoff *= 1 + jitter*(rand.Float64()*2-1)
|
|
if backoff < 0 {
|
|
return 0
|
|
}
|
|
|
|
return time.Duration(backoff)
|
|
}
|