Skip to content

Commit

Permalink
helper: guard against negative inputs into random stagger
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
shoenig committed Sep 8, 2022
1 parent cde9f6c commit 75b30c2
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 75b30c2

Please sign in to comment.