Skip to content

Commit

Permalink
Merge pull request #14497 from hashicorp/b-guard-random-stagger
Browse files Browse the repository at this point in the history
helper: guard against negative inputs into random stagger
  • Loading branch information
shoenig committed Sep 8, 2022
2 parents 3dab024 + 75b30c2 commit 1d9c996
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 4 deletions.
3 changes: 3 additions & 0 deletions .changelog/14497.txt
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
```release-note:bug
helpers: Fixed a bug where random stagger func did not protect against negative inputs
```
7 changes: 3 additions & 4 deletions helper/cluster.go
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
// These functions are coming from consul/lib/cluster.go
package helper

import (
Expand All @@ -13,11 +12,11 @@ const (
)

// RandomStagger returns an interval between 0 and the duration
func RandomStagger(intv time.Duration) time.Duration {
if intv == 0 {
func RandomStagger(interval time.Duration) time.Duration {
if interval <= 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
Expand Down
29 changes: 29 additions & 0 deletions helper/cluster_test.go
Original file line number Diff line number Diff line change
@@ -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))
}
}

0 comments on commit 1d9c996

Please sign in to comment.