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:
Seth Hoenig 2022-09-08 09:13:35 -05:00
parent 7ff0290f8b
commit a608e7950e
3 changed files with 35 additions and 4 deletions

3
.changelog/14497.txt Normal file
View File

@ -0,0 +1,3 @@
```release-note:bug
helpers: Fixed a bug where random stagger func did not protect against negative inputs
```

View File

@ -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

29
helper/cluster_test.go Normal file
View File

@ -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))
}
}