mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 00:28:26 -05:00
8fb89a5728
PROBLEM: [$rd1 read] reads invalidation messages one by one, so it's never going to see the second invalidation message produced after INCR b, whether or not it exists. Adding another read will block incase no invalidation message is produced. FIX: We switch the order of "INCR a" and "INCR b" - now "INCR b" comes first. We still only read the first invalidation message produces. If an invalidation message is wrongly produces for b - then it will be produced before that of a, since "INCR b" comes before "INCR a". Co-authored-by: Nitai Caro <caronita@amazon.com>
135 lines
5.0 KiB
Tcl
135 lines
5.0 KiB
Tcl
start_server {tags {"tracking"}} {
|
|
# Create a deferred client we'll use to redirect invalidation
|
|
# messages to.
|
|
set rd1 [redis_deferring_client]
|
|
$rd1 client id
|
|
set redir [$rd1 read]
|
|
$rd1 subscribe __redis__:invalidate
|
|
$rd1 read ; # Consume the SUBSCRIBE reply.
|
|
|
|
# Create another client as well in order to test NOLOOP
|
|
set rd2 [redis_deferring_client]
|
|
|
|
test {Clients are able to enable tracking and redirect it} {
|
|
r CLIENT TRACKING on REDIRECT $redir
|
|
} {*OK}
|
|
|
|
test {The other connection is able to get invalidations} {
|
|
r SET a 1
|
|
r SET b 1
|
|
r GET a
|
|
r INCR b ; # This key should not be notified, since it wasn't fetched.
|
|
r INCR a
|
|
set keys [lindex [$rd1 read] 2]
|
|
assert {[llength $keys] == 1}
|
|
assert {[lindex $keys 0] eq {a}}
|
|
}
|
|
|
|
test {The client is now able to disable tracking} {
|
|
# Make sure to add a few more keys in the tracking list
|
|
# so that we can check for leaks, as a side effect.
|
|
r MGET a b c d e f g
|
|
r CLIENT TRACKING off
|
|
}
|
|
|
|
test {Clients can enable the BCAST mode with the empty prefix} {
|
|
r CLIENT TRACKING on BCAST REDIRECT $redir
|
|
} {*OK*}
|
|
|
|
test {The connection gets invalidation messages about all the keys} {
|
|
r MSET a 1 b 2 c 3
|
|
set keys [lsort [lindex [$rd1 read] 2]]
|
|
assert {$keys eq {a b c}}
|
|
}
|
|
|
|
test {Clients can enable the BCAST mode with prefixes} {
|
|
r CLIENT TRACKING off
|
|
r CLIENT TRACKING on BCAST REDIRECT $redir PREFIX a: PREFIX b:
|
|
r MULTI
|
|
r INCR a:1
|
|
r INCR a:2
|
|
r INCR b:1
|
|
r INCR b:2
|
|
r EXEC
|
|
# Because of the internals, we know we are going to receive
|
|
# two separated notifications for the two different prefixes.
|
|
set keys1 [lsort [lindex [$rd1 read] 2]]
|
|
set keys2 [lsort [lindex [$rd1 read] 2]]
|
|
set keys [lsort [list {*}$keys1 {*}$keys2]]
|
|
assert {$keys eq {a:1 a:2 b:1 b:2}}
|
|
}
|
|
|
|
test {Adding prefixes to BCAST mode works} {
|
|
r CLIENT TRACKING on BCAST REDIRECT $redir PREFIX c:
|
|
r INCR c:1234
|
|
set keys [lsort [lindex [$rd1 read] 2]]
|
|
assert {$keys eq {c:1234}}
|
|
}
|
|
|
|
test {Tracking NOLOOP mode in standard mode works} {
|
|
r CLIENT TRACKING off
|
|
r CLIENT TRACKING on REDIRECT $redir NOLOOP
|
|
r MGET otherkey1 loopkey otherkey2
|
|
$rd2 SET otherkey1 1; # We should get this
|
|
r SET loopkey 1 ; # We should not get this
|
|
$rd2 SET otherkey2 1; # We should get this
|
|
# Because of the internals, we know we are going to receive
|
|
# two separated notifications for the two different prefixes.
|
|
set keys1 [lsort [lindex [$rd1 read] 2]]
|
|
set keys2 [lsort [lindex [$rd1 read] 2]]
|
|
set keys [lsort [list {*}$keys1 {*}$keys2]]
|
|
assert {$keys eq {otherkey1 otherkey2}}
|
|
}
|
|
|
|
test {Tracking NOLOOP mode in BCAST mode works} {
|
|
r CLIENT TRACKING off
|
|
r CLIENT TRACKING on BCAST REDIRECT $redir NOLOOP
|
|
$rd2 SET otherkey1 1; # We should get this
|
|
r SET loopkey 1 ; # We should not get this
|
|
$rd2 SET otherkey2 1; # We should get this
|
|
# Because of the internals, we know we are going to receive
|
|
# two separated notifications for the two different prefixes.
|
|
set keys1 [lsort [lindex [$rd1 read] 2]]
|
|
set keys2 [lsort [lindex [$rd1 read] 2]]
|
|
set keys [lsort [list {*}$keys1 {*}$keys2]]
|
|
assert {$keys eq {otherkey1 otherkey2}}
|
|
}
|
|
|
|
test {Tracking gets notification of expired keys} {
|
|
r CLIENT TRACKING off
|
|
r CLIENT TRACKING on BCAST REDIRECT $redir NOLOOP
|
|
r SET mykey myval px 1
|
|
r SET mykeyotherkey myval ; # We should not get it
|
|
after 1000
|
|
# Because of the internals, we know we are going to receive
|
|
# two separated notifications for the two different prefixes.
|
|
set keys1 [lsort [lindex [$rd1 read] 2]]
|
|
set keys [lsort [list {*}$keys1]]
|
|
assert {$keys eq {mykey}}
|
|
}
|
|
|
|
test {Tracking gets notification on tracking table key eviction} {
|
|
r CLIENT TRACKING off
|
|
r CLIENT TRACKING on REDIRECT $redir NOLOOP
|
|
r MSET key1 1 key2 2
|
|
# Let the server track the two keys for us
|
|
r MGET key1 key2
|
|
# Force the eviction of all the keys but one:
|
|
r config set tracking-table-max-keys 1
|
|
# Note that we may have other keys in the table for this client,
|
|
# since we disabled/enabled tracking multiple time with the same
|
|
# ID, and tracking does not do ID cleanups for performance reasons.
|
|
# So we check that eventually we'll receive one or the other key,
|
|
# otherwise the test will die for timeout.
|
|
while 1 {
|
|
set keys [lindex [$rd1 read] 2]
|
|
if {$keys eq {key1} || $keys eq {key2}} break
|
|
}
|
|
# We should receive an expire notification for one of
|
|
# the two keys (only one must remain)
|
|
assert {$keys eq {key1} || $keys eq {key2}}
|
|
}
|
|
|
|
$rd1 close
|
|
}
|