mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 16:18:28 -05:00
044e29dd34
Recently, the option of sending an argument from stdin using `-x` flag was added to redis-benchmark (this option is available in redis-cli as well). However, using the `-x` option for sending a blobs that contains null-characters doesn't work as expected - the argument is trimmed in the first occurrence of `\X00` (unlike in redis-cli). This PR aims to fix this issue and add the support for every binary string input, by sending arguments length to `redisFormatCommandArgv` when processing redis-benchmark command, so we won't treat the arguments as C-strings. Additionally, we add a simple test coverage for `-x` (without binary strings, and also remove an excessive server started in tests, and make sure to select db 0 so that `r` and the benchmark work on the same db. Co-authored-by: Oran Agra <oran@redislabs.com>
180 lines
7.6 KiB
Tcl
180 lines
7.6 KiB
Tcl
source tests/support/benchmark.tcl
|
|
source tests/support/cli.tcl
|
|
|
|
proc cmdstat {cmd} {
|
|
return [cmdrstat $cmd r]
|
|
}
|
|
|
|
# common code to reset stats, flush the db and run redis-benchmark
|
|
proc common_bench_setup {cmd} {
|
|
r config resetstat
|
|
r flushall
|
|
if {[catch { exec {*}$cmd } error]} {
|
|
set first_line [lindex [split $error "\n"] 0]
|
|
puts [colorstr red "redis-benchmark non zero code. first line: $first_line"]
|
|
fail "redis-benchmark non zero code. first line: $first_line"
|
|
}
|
|
}
|
|
|
|
# we use this extra asserts on a simple set,get test for features like uri parsing
|
|
# and other simple flag related tests
|
|
proc default_set_get_checks {} {
|
|
assert_match {*calls=10,*} [cmdstat set]
|
|
assert_match {*calls=10,*} [cmdstat get]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat lrange]
|
|
}
|
|
|
|
tags {"benchmark network external:skip logreqres:skip"} {
|
|
start_server {} {
|
|
set master_host [srv 0 host]
|
|
set master_port [srv 0 port]
|
|
r select 0
|
|
|
|
test {benchmark: set,get} {
|
|
set cmd [redisbenchmark $master_host $master_port "-c 5 -n 10 -t set,get"]
|
|
common_bench_setup $cmd
|
|
default_set_get_checks
|
|
}
|
|
|
|
test {benchmark: connecting using URI set,get} {
|
|
set cmd [redisbenchmarkuri $master_host $master_port "-c 5 -n 10 -t set,get"]
|
|
common_bench_setup $cmd
|
|
default_set_get_checks
|
|
}
|
|
|
|
test {benchmark: connecting using URI with authentication set,get} {
|
|
r config set masterauth pass
|
|
set cmd [redisbenchmarkuriuserpass $master_host $master_port "default" pass "-c 5 -n 10 -t set,get"]
|
|
common_bench_setup $cmd
|
|
default_set_get_checks
|
|
}
|
|
|
|
test {benchmark: full test suite} {
|
|
set cmd [redisbenchmark $master_host $master_port "-c 10 -n 100"]
|
|
common_bench_setup $cmd
|
|
|
|
# ping total calls are 2*issued commands per test due to PING_INLINE and PING_MBULK
|
|
assert_match {*calls=200,*} [cmdstat ping]
|
|
assert_match {*calls=100,*} [cmdstat set]
|
|
assert_match {*calls=100,*} [cmdstat get]
|
|
assert_match {*calls=100,*} [cmdstat incr]
|
|
# lpush total calls are 2*issued commands per test due to the lrange tests
|
|
assert_match {*calls=200,*} [cmdstat lpush]
|
|
assert_match {*calls=100,*} [cmdstat rpush]
|
|
assert_match {*calls=100,*} [cmdstat lpop]
|
|
assert_match {*calls=100,*} [cmdstat rpop]
|
|
assert_match {*calls=100,*} [cmdstat sadd]
|
|
assert_match {*calls=100,*} [cmdstat hset]
|
|
assert_match {*calls=100,*} [cmdstat spop]
|
|
assert_match {*calls=100,*} [cmdstat zadd]
|
|
assert_match {*calls=100,*} [cmdstat zpopmin]
|
|
assert_match {*calls=400,*} [cmdstat lrange]
|
|
assert_match {*calls=100,*} [cmdstat mset]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat rpoplpush]
|
|
}
|
|
|
|
test {benchmark: multi-thread set,get} {
|
|
set cmd [redisbenchmark $master_host $master_port "--threads 10 -c 5 -n 10 -t set,get"]
|
|
common_bench_setup $cmd
|
|
default_set_get_checks
|
|
|
|
# ensure only one key was populated
|
|
assert_match {1} [scan [regexp -inline {keys\=([\d]*)} [r info keyspace]] keys=%d]
|
|
}
|
|
|
|
test {benchmark: pipelined full set,get} {
|
|
set cmd [redisbenchmark $master_host $master_port "-P 5 -c 10 -n 10010 -t set,get"]
|
|
common_bench_setup $cmd
|
|
assert_match {*calls=10010,*} [cmdstat set]
|
|
assert_match {*calls=10010,*} [cmdstat get]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat lrange]
|
|
|
|
# ensure only one key was populated
|
|
assert_match {1} [scan [regexp -inline {keys\=([\d]*)} [r info keyspace]] keys=%d]
|
|
}
|
|
|
|
test {benchmark: arbitrary command} {
|
|
set cmd [redisbenchmark $master_host $master_port "-c 5 -n 150 INCRBYFLOAT mykey 10.0"]
|
|
common_bench_setup $cmd
|
|
assert_match {*calls=150,*} [cmdstat incrbyfloat]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat get]
|
|
|
|
# ensure only one key was populated
|
|
assert_match {1} [scan [regexp -inline {keys\=([\d]*)} [r info keyspace]] keys=%d]
|
|
}
|
|
|
|
test {benchmark: keyspace length} {
|
|
set cmd [redisbenchmark $master_host $master_port "-r 50 -t set -n 1000"]
|
|
common_bench_setup $cmd
|
|
assert_match {*calls=1000,*} [cmdstat set]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat get]
|
|
|
|
# ensure the keyspace has the desired size
|
|
assert_match {50} [scan [regexp -inline {keys\=([\d]*)} [r info keyspace]] keys=%d]
|
|
}
|
|
|
|
test {benchmark: clients idle mode should return error when reached maxclients limit} {
|
|
set cmd [redisbenchmark $master_host $master_port "-c 10 -I"]
|
|
set original_maxclients [lindex [r config get maxclients] 1]
|
|
r config set maxclients 5
|
|
catch { exec {*}$cmd } error
|
|
assert_match "*Error*" $error
|
|
r config set maxclients $original_maxclients
|
|
}
|
|
|
|
test {benchmark: read last argument from stdin} {
|
|
set base_cmd [redisbenchmark $master_host $master_port "-x -n 10 set key"]
|
|
set cmd "printf arg | $base_cmd"
|
|
common_bench_setup $cmd
|
|
r get key
|
|
} {arg}
|
|
|
|
# tls specific tests
|
|
if {$::tls} {
|
|
test {benchmark: specific tls-ciphers} {
|
|
set cmd [redisbenchmark $master_host $master_port "-r 50 -t set -n 1000 --tls-ciphers \"DEFAULT:-AES128-SHA256\""]
|
|
common_bench_setup $cmd
|
|
assert_match {*calls=1000,*} [cmdstat set]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat get]
|
|
}
|
|
|
|
test {benchmark: tls connecting using URI with authentication set,get} {
|
|
r config set masterauth pass
|
|
set cmd [redisbenchmarkuriuserpass $master_host $master_port "default" pass "-c 5 -n 10 -t set,get"]
|
|
common_bench_setup $cmd
|
|
default_set_get_checks
|
|
}
|
|
|
|
test {benchmark: specific tls-ciphersuites} {
|
|
r flushall
|
|
r config resetstat
|
|
set ciphersuites_supported 1
|
|
set cmd [redisbenchmark $master_host $master_port "-r 50 -t set -n 1000 --tls-ciphersuites \"TLS_AES_128_GCM_SHA256\""]
|
|
if {[catch { exec {*}$cmd } error]} {
|
|
set first_line [lindex [split $error "\n"] 0]
|
|
if {[string match "*Invalid option*" $first_line]} {
|
|
set ciphersuites_supported 0
|
|
if {$::verbose} {
|
|
puts "Skipping test, TLSv1.3 not supported."
|
|
}
|
|
} else {
|
|
puts [colorstr red "redis-benchmark non zero code. first line: $first_line"]
|
|
fail "redis-benchmark non zero code. first line: $first_line"
|
|
}
|
|
}
|
|
if {$ciphersuites_supported} {
|
|
assert_match {*calls=1000,*} [cmdstat set]
|
|
# assert one of the non benchmarked commands is not present
|
|
assert_match {} [cmdstat get]
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|