Files
5d7d542499 Add cache for COMMAND (#2839)
COMMAND command is expensive to process (too much string operations)
but result is rarely changes, it makes sense to add caching

---------

Signed-off-by: Evgeny Barskiy <[email protected]>
Signed-off-by: Viktor Söderqvist <[email protected]>
Co-authored-by: Cursor <[email protected]>
Co-authored-by: Viktor Söderqvist <[email protected]>
2026-02-04 12:57:04 +01:00

166 lines
5.4 KiB
Tcl

set testmodule [file normalize tests/modules/basics.so]
start_server {tags {"modules"}} {
test {COMMAND caches response} {
# Call COMMAND twice and verify we get the same commands
set cmd1 [r command]
set cmd2 [r command]
assert_equal [llength $cmd1] [llength $cmd2]
}
test {COMMAND cache is invalidated on module load} {
# Get initial command list
set commands_before [r command]
set count_before [llength $commands_before]
# Verify module commands are not present
set module_commands_found 0
foreach cmd $commands_before {
set name [lindex $cmd 0]
if {[string match "test.*" $name]} {
incr module_commands_found
}
}
assert_equal $module_commands_found 0
# Load module which should invalidate the cache
r module load $testmodule
# Get command list again (first call populates cache, second uses cache)
r command
set commands_after [r command]
set count_after [llength $commands_after]
# Verify we have more commands now
assert {$count_after > $count_before}
# Verify module commands are now present
set module_commands_found 0
foreach cmd $commands_after {
set name [lindex $cmd 0]
if {[string match "test.*" $name]} {
incr module_commands_found
}
}
assert {$module_commands_found > 0}
}
test {COMMAND INFO works with module commands} {
# Verify we can get info about a specific module command
set info [r command info test.basics]
assert_equal [llength $info] 1
assert_equal [lindex [lindex $info 0] 0] "test.basics"
}
test {COMMAND COUNT includes module commands} {
set count_with_module [r command count]
# Count should be greater than typical server commands
assert {$count_with_module > 200}
}
test {COMMAND cache is invalidated on module unload} {
# Get command list with module loaded
set commands_before [r command]
set count_before [llength $commands_before]
# Verify module commands are present
set module_commands_found 0
foreach cmd $commands_before {
set name [lindex $cmd 0]
if {[string match "test.*" $name]} {
incr module_commands_found
}
}
assert {$module_commands_found > 0}
# Unload module which should invalidate the cache
r module unload test
# Get command list again (first call populates cache, second uses cache)
r command
set commands_after [r command]
set count_after [llength $commands_after]
# Verify we have fewer commands now
assert {$count_after < $count_before}
# Verify module commands are no longer present
set module_commands_found 0
foreach cmd $commands_after {
set name [lindex $cmd 0]
if {[string match "test.*" $name]} {
incr module_commands_found
}
}
assert_equal $module_commands_found 0
}
test {COMMAND INFO returns empty for unloaded module commands} {
# Verify we get empty/null response for module command after unload
set info [r command info test.basics]
# COMMAND INFO returns a list with one empty element for non-existent commands
assert_equal [llength $info] 1
assert_equal [lindex $info 0] {}
}
}
start_server {tags {"modules"}} {
test {COMMAND cache invalidation with multiple load/unload cycles} {
# Get baseline
set baseline_count [r command count]
# Load module
r module load $testmodule
set count_loaded [r command count]
assert {$count_loaded > $baseline_count}
# Unload module
r module unload test
set count_unloaded [r command count]
assert_equal $count_unloaded $baseline_count
# Load again
r module load $testmodule
set count_loaded_again [r command count]
assert_equal $count_loaded_again $count_loaded
# Unload again
r module unload test
set count_unloaded_again [r command count]
assert_equal $count_unloaded_again $baseline_count
}
}
start_server {tags {"modules"}} {
test {COMMAND cache works correctly with RESP2 and RESP3} {
# Test with RESP2
r hello 2
set commands_resp2_before [r command]
# Load module
r module load $testmodule
set commands_resp2_after [r command]
assert {[llength $commands_resp2_after] > [llength $commands_resp2_before]}
# Switch to RESP3 and verify cache works
r hello 3
set commands_resp3 [r command]
# Both should have the same number of commands
assert_equal [llength $commands_resp3] [llength $commands_resp2_after]
# Unload module
r module unload test
# Verify both RESP versions see the change
set commands_resp3_after [r command]
assert {[llength $commands_resp3_after] < [llength $commands_resp3]}
r hello 2
set commands_resp2_final [r command]
assert_equal [llength $commands_resp2_final] [llength $commands_resp3_after]
}
}