mirror of
https://github.com/kemko/nomad.git
synced 2026-01-01 16:05:42 +03:00
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:
3
.changelog/14497.txt
Normal file
3
.changelog/14497.txt
Normal file
@@ -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
|
||||
|
||||
import (
|
||||
@@ -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
|
||||
|
||||
29
helper/cluster_test.go
Normal file
29
helper/cluster_test.go
Normal 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))
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user