helper: guard against negative inputs into random stagger
This PR modifies RandomStagger to protect against negative input values. If the given interval is negative, the value returned will be somewhere in the stratosphere. Instead, treat negative inputs like zero, returning zero.
This commit is contained in:
parent
7ff0290f8b
commit
a608e7950e
|
@ -0,0 +1,3 @@
|
||||||
|
```release-note:bug
|
||||||
|
helpers: Fixed a bug where random stagger func did not protect against negative inputs
|
||||||
|
```
|
|
@ -1,4 +1,3 @@
|
||||||
// These functions are coming from consul/lib/cluster.go
|
|
||||||
package helper
|
package helper
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
@ -13,11 +12,11 @@ const (
|
||||||
)
|
)
|
||||||
|
|
||||||
// RandomStagger returns an interval between 0 and the duration
|
// RandomStagger returns an interval between 0 and the duration
|
||||||
func RandomStagger(intv time.Duration) time.Duration {
|
func RandomStagger(interval time.Duration) time.Duration {
|
||||||
if intv == 0 {
|
if interval <= 0 {
|
||||||
return 0
|
return 0
|
||||||
}
|
}
|
||||||
return time.Duration(uint64(rand.Int63()) % uint64(intv))
|
return time.Duration(uint64(rand.Int63()) % uint64(interval))
|
||||||
}
|
}
|
||||||
|
|
||||||
// RateScaledInterval is used to choose an interval to perform an action in
|
// RateScaledInterval is used to choose an interval to perform an action in
|
||||||
|
|
|
@ -0,0 +1,29 @@
|
||||||
|
package helper
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/shoenig/test/must"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestCluster_RandomStagger(t *testing.T) {
|
||||||
|
cases := []struct {
|
||||||
|
name string
|
||||||
|
input time.Duration
|
||||||
|
}{
|
||||||
|
{name: "positive", input: 1 * time.Second},
|
||||||
|
{name: "negative", input: -1 * time.Second},
|
||||||
|
{name: "zero", input: 0},
|
||||||
|
}
|
||||||
|
|
||||||
|
abs := func(d time.Duration) time.Duration {
|
||||||
|
return Max(d, -d)
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, tc := range cases {
|
||||||
|
result := RandomStagger(tc.input)
|
||||||
|
must.GreaterEq(t, result, 0)
|
||||||
|
must.LessEq(t, result, abs(tc.input))
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue