redict/tests/integration/redis-benchmark.tcl
judeng d2405b9b6b
fix benchmark failure in daily test with TLS (#10896)
The new test added in #10891 can fail with a different error.
see comment in networking.c saying
```c
        /* That's a best effort error message, don't check write errors.
         * Note that for TLS connections, no handshake was done yet so nothing
         * is written and the connection will just drop. */
```
2022-06-23 18:19:36 +03:00

172 lines
7.3 KiB
Tcl

source tests/support/benchmark.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]
}
start_server {tags {"benchmark network external:skip"}} {
start_server {} {
set master_host [srv 0 host]
set master_port [srv 0 port]
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
}
# 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]
}
}
}
}
}