-
Notifications
You must be signed in to change notification settings - Fork 4.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge remote-tracking branch 'oss/master' into generic-to-kv
* oss/master: Adding latency injector option to -dev mode for storage operations (#3289) fix: add missing comma to payload (#3308) Switching atomic vars to int32 to address panic on some architectures (#3314) Update AWS CloudHSM comparison. (#3311)
- Loading branch information
Showing
6 changed files
with
119 additions
and
25 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,90 @@ | ||
package physical | ||
|
||
import ( | ||
"math/rand" | ||
"time" | ||
|
||
log "github.com/mgutz/logxi/v1" | ||
) | ||
|
||
const ( | ||
// DefaultJitterPercent is used if no cache size is specified for NewCache | ||
DefaultJitterPercent = 20 | ||
) | ||
|
||
// LatencyInjector is used to add latency into underlying physical requests | ||
type LatencyInjector struct { | ||
backend Backend | ||
latency time.Duration | ||
jitterPercent int | ||
random *rand.Rand | ||
} | ||
|
||
// TransactionalLatencyInjector is the transactional version of the latency | ||
// injector | ||
type TransactionalLatencyInjector struct { | ||
*LatencyInjector | ||
Transactional | ||
} | ||
|
||
// NewLatencyInjector returns a wrapped physical backend to simulate latency | ||
func NewLatencyInjector(b Backend, latency time.Duration, jitter int, logger log.Logger) *LatencyInjector { | ||
if jitter < 0 || jitter > 100 { | ||
jitter = DefaultJitterPercent | ||
} | ||
logger.Info("physical/latency: creating latency injector") | ||
|
||
return &LatencyInjector{ | ||
backend: b, | ||
latency: latency, | ||
jitterPercent: jitter, | ||
random: rand.New(rand.NewSource(int64(time.Now().Nanosecond()))), | ||
} | ||
} | ||
|
||
// NewTransactionalLatencyInjector creates a new transactional LatencyInjector | ||
func NewTransactionalLatencyInjector(b Backend, latency time.Duration, jitter int, logger log.Logger) *TransactionalLatencyInjector { | ||
return &TransactionalLatencyInjector{ | ||
LatencyInjector: NewLatencyInjector(b, latency, jitter, logger), | ||
Transactional: b.(Transactional), | ||
} | ||
} | ||
|
||
func (l *LatencyInjector) addLatency() { | ||
// Calculate a value between 1 +- jitter% | ||
min := 100 - l.jitterPercent | ||
max := 100 + l.jitterPercent | ||
percent := l.random.Intn(max-min) + min | ||
latencyDuration := time.Duration(int(l.latency) * percent / 100) | ||
time.Sleep(latencyDuration) | ||
} | ||
|
||
// Put is a latent put request | ||
func (l *LatencyInjector) Put(entry *Entry) error { | ||
l.addLatency() | ||
return l.backend.Put(entry) | ||
} | ||
|
||
// Get is a latent get request | ||
func (l *LatencyInjector) Get(key string) (*Entry, error) { | ||
l.addLatency() | ||
return l.backend.Get(key) | ||
} | ||
|
||
// Delete is a latent delete request | ||
func (l *LatencyInjector) Delete(key string) error { | ||
l.addLatency() | ||
return l.backend.Delete(key) | ||
} | ||
|
||
// List is a latent list request | ||
func (l *LatencyInjector) List(prefix string) ([]string, error) { | ||
l.addLatency() | ||
return l.backend.List(prefix) | ||
} | ||
|
||
// Transaction is a latent transaction request | ||
func (l *TransactionalLatencyInjector) Transaction(txns []TxnEntry) error { | ||
l.addLatency() | ||
return l.Transactional.Transaction(txns) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters