mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-22 08:08:53 -05:00
196 lines
6.5 KiB
Tcl
196 lines
6.5 KiB
Tcl
# SPDX-FileCopyrightText: 2024 Redict Contributors
|
|
# SPDX-FileCopyrightText: 2024 Salvatore Sanfilippo <antirez at gmail dot com>
|
|
#
|
|
# SPDX-License-Identifier: BSD-3-Clause
|
|
# SPDX-License-Identifier: GPL-3.0-only
|
|
|
|
start_server {tags {"latency-monitor needs:latency"}} {
|
|
# Set a threshold high enough to avoid spurious latency events.
|
|
r config set latency-monitor-threshold 200
|
|
r latency reset
|
|
|
|
test {LATENCY HISTOGRAM with empty histogram} {
|
|
r config resetstat
|
|
set histo [dict create {*}[r latency histogram]]
|
|
# Config resetstat is recorded
|
|
assert_equal [dict size $histo] 1
|
|
assert_match {*config|resetstat*} $histo
|
|
}
|
|
|
|
test {LATENCY HISTOGRAM all commands} {
|
|
r config resetstat
|
|
r set a b
|
|
r set c d
|
|
set histo [dict create {*}[r latency histogram]]
|
|
assert_match {calls 2 histogram_usec *} [dict get $histo set]
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo "config|resetstat"]
|
|
}
|
|
|
|
test {LATENCY HISTOGRAM sub commands} {
|
|
r config resetstat
|
|
r client id
|
|
r client list
|
|
# parent command reply with its sub commands
|
|
set histo [dict create {*}[r latency histogram client]]
|
|
assert {[dict size $histo] == 2}
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo "client|id"]
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo "client|list"]
|
|
|
|
# explicitly ask for one sub-command
|
|
set histo [dict create {*}[r latency histogram "client|id"]]
|
|
assert {[dict size $histo] == 1}
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo "client|id"]
|
|
}
|
|
|
|
test {LATENCY HISTOGRAM with a subset of commands} {
|
|
r config resetstat
|
|
r set a b
|
|
r set c d
|
|
r get a
|
|
r hset f k v
|
|
r hgetall f
|
|
set histo [dict create {*}[r latency histogram set hset]]
|
|
assert_match {calls 2 histogram_usec *} [dict get $histo set]
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo hset]
|
|
assert_equal [dict size $histo] 2
|
|
set histo [dict create {*}[r latency histogram hgetall get zadd]]
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo hgetall]
|
|
assert_match {calls 1 histogram_usec *} [dict get $histo get]
|
|
assert_equal [dict size $histo] 2
|
|
}
|
|
|
|
test {LATENCY HISTOGRAM command} {
|
|
r config resetstat
|
|
r set a b
|
|
r get a
|
|
assert {[llength [r latency histogram set get]] == 4}
|
|
}
|
|
|
|
test {LATENCY HISTOGRAM with wrong command name skips the invalid one} {
|
|
r config resetstat
|
|
assert {[llength [r latency histogram blabla]] == 0}
|
|
assert {[llength [r latency histogram blabla blabla2 set get]] == 0}
|
|
r set a b
|
|
r get a
|
|
assert_match {calls 1 histogram_usec *} [lindex [r latency histogram blabla blabla2 set get] 1]
|
|
assert_match {calls 1 histogram_usec *} [lindex [r latency histogram blabla blabla2 set get] 3]
|
|
assert {[string length [r latency histogram blabla set get]] > 0}
|
|
}
|
|
|
|
tags {"needs:debug"} {
|
|
set old_threshold_value [lindex [r config get latency-monitor-threshold] 1]
|
|
|
|
test {Test latency events logging} {
|
|
r config set latency-monitor-threshold 200
|
|
r latency reset
|
|
r debug sleep 0.3
|
|
after 1100
|
|
r debug sleep 0.4
|
|
after 1100
|
|
r debug sleep 0.5
|
|
r config set latency-monitor-threshold 0
|
|
assert {[r latency history command] >= 3}
|
|
}
|
|
|
|
test {LATENCY HISTORY output is ok} {
|
|
set res [r latency history command]
|
|
if {$::verbose} {
|
|
puts "LATENCY HISTORY data:"
|
|
puts $res
|
|
}
|
|
|
|
set min 250
|
|
set max 450
|
|
foreach event $res {
|
|
lassign $event time latency
|
|
if {!$::no_latency} {
|
|
assert {$latency >= $min && $latency <= $max}
|
|
}
|
|
incr min 100
|
|
incr max 100
|
|
set last_time $time ; # Used in the next test
|
|
}
|
|
}
|
|
|
|
test {LATENCY LATEST output is ok} {
|
|
set res [r latency latest]
|
|
if {$::verbose} {
|
|
puts "LATENCY LATEST data:"
|
|
puts $res
|
|
}
|
|
|
|
foreach event $res {
|
|
lassign $event eventname time latency max
|
|
assert {$eventname eq "command"}
|
|
if {!$::no_latency} {
|
|
assert {$max >= 450 & $max <= 650}
|
|
assert {$time == $last_time}
|
|
}
|
|
break
|
|
}
|
|
}
|
|
|
|
test {LATENCY GRAPH can output the event graph} {
|
|
set res [r latency graph command]
|
|
if {$::verbose} {
|
|
puts "LATENCY GRAPH data:"
|
|
puts $res
|
|
}
|
|
assert_match {*command*high*low*} $res
|
|
|
|
# These numbers are taken from the "Test latency events logging" test.
|
|
# (debug sleep 0.3) and (debug sleep 0.5), using range to prevent timing issue.
|
|
regexp "command - high (.*?) ms, low (.*?) ms" $res -> high low
|
|
assert_morethan_equal $high 500
|
|
assert_morethan_equal $low 300
|
|
}
|
|
|
|
r config set latency-monitor-threshold $old_threshold_value
|
|
} ;# tag
|
|
|
|
test {LATENCY of expire events are correctly collected} {
|
|
r config set latency-monitor-threshold 20
|
|
r flushdb
|
|
if {$::valgrind} {set count 100000} else {set count 1000000}
|
|
r eval {
|
|
local i = 0
|
|
while (i < tonumber(ARGV[1])) do
|
|
redis.call('sadd',KEYS[1],i)
|
|
i = i+1
|
|
end
|
|
} 1 mybigkey $count
|
|
r pexpire mybigkey 50
|
|
wait_for_condition 5 100 {
|
|
[r dbsize] == 0
|
|
} else {
|
|
fail "key wasn't expired"
|
|
}
|
|
assert_match {*expire-cycle*} [r latency latest]
|
|
|
|
test {LATENCY GRAPH can output the expire event graph} {
|
|
assert_match {*expire-cycle*high*low*} [r latency graph expire-cycle]
|
|
}
|
|
|
|
r config set latency-monitor-threshold 200
|
|
}
|
|
|
|
test {LATENCY HISTORY / RESET with wrong event name is fine} {
|
|
assert {[llength [r latency history blabla]] == 0}
|
|
assert {[r latency reset blabla] == 0}
|
|
}
|
|
|
|
test {LATENCY DOCTOR produces some output} {
|
|
assert {[string length [r latency doctor]] > 0}
|
|
}
|
|
|
|
test {LATENCY RESET is able to reset events} {
|
|
assert {[r latency reset] > 0}
|
|
assert {[r latency latest] eq {}}
|
|
}
|
|
|
|
test {LATENCY HELP should not have unexpected options} {
|
|
catch {r LATENCY help xxx} e
|
|
assert_match "*wrong number of arguments for 'latency|help' command" $e
|
|
}
|
|
}
|