Remove data races around error/latency injector rand objects

This commit is contained in:
Jeff Mitchell 2019-06-05 01:37:40 -04:00
parent d1be7165b0
commit ab520a9119
2 changed files with 10 additions and 0 deletions

View File

@ -4,6 +4,7 @@ import (
"context"
"errors"
"math/rand"
"sync"
"time"
log "github.com/hashicorp/go-hclog"
@ -18,6 +19,7 @@ const (
type ErrorInjector struct {
backend Backend
errorPercent int
randomLock *sync.Mutex
random *rand.Rand
}
@ -42,6 +44,7 @@ func NewErrorInjector(b Backend, errorPercent int, logger log.Logger) *ErrorInje
return &ErrorInjector{
backend: b,
errorPercent: errorPercent,
randomLock: new(sync.Mutex),
random: rand.New(rand.NewSource(int64(time.Now().Nanosecond()))),
}
}
@ -59,7 +62,9 @@ func (e *ErrorInjector) SetErrorPercentage(p int) {
}
func (e *ErrorInjector) addError() error {
e.randomLock.Lock()
roll := e.random.Intn(100)
e.randomLock.Unlock()
if roll < e.errorPercent {
return errors.New("random error")
}

View File

@ -3,6 +3,7 @@ package physical
import (
"context"
"math/rand"
"sync"
"time"
log "github.com/hashicorp/go-hclog"
@ -19,6 +20,7 @@ type LatencyInjector struct {
backend Backend
latency time.Duration
jitterPercent int
randomLock *sync.Mutex
random *rand.Rand
}
@ -45,6 +47,7 @@ func NewLatencyInjector(b Backend, latency time.Duration, jitter int, logger log
backend: b,
latency: latency,
jitterPercent: jitter,
randomLock: new(sync.Mutex),
random: rand.New(rand.NewSource(int64(time.Now().Nanosecond()))),
}
}
@ -68,7 +71,9 @@ func (l *LatencyInjector) addLatency() {
if l.jitterPercent > 0 {
min := 100 - l.jitterPercent
max := 100 + l.jitterPercent
l.randomLock.Lock()
percent = l.random.Intn(max-min) + min
l.randomLock.Unlock()
}
latencyDuration := time.Duration(int(l.latency) * percent / 100)
time.Sleep(latencyDuration)