summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/tests/unit/pause.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/tests/unit/pause.tcl')
-rw-r--r--examples/redis-unstable/tests/unit/pause.tcl431
1 files changed, 0 insertions, 431 deletions
diff --git a/examples/redis-unstable/tests/unit/pause.tcl b/examples/redis-unstable/tests/unit/pause.tcl
deleted file mode 100644
index c649db9..0000000
--- a/examples/redis-unstable/tests/unit/pause.tcl
+++ /dev/null
@@ -1,431 +0,0 @@
-#
-# Copyright (c) 2009-Present, Redis Ltd.
-# All rights reserved.
-#
-# Copyright (c) 2024-present, Valkey contributors.
-# All rights reserved.
-#
-# Licensed under your choice of (a) the Redis Source Available License 2.0
-# (RSALv2); or (b) the Server Side Public License v1 (SSPLv1); or (c) the
-# GNU Affero General Public License v3 (AGPLv3).
-#
-# Portions of this file are available under BSD3 terms; see REDISCONTRIBUTIONS for more information.
-#
-
-start_server {tags {"pause network"}} {
- test "Test read commands are not blocked by client pause" {
- r client PAUSE 100000 WRITE
- set rd [redis_deferring_client]
- $rd GET FOO
- $rd PING
- $rd INFO
- assert_equal [s 0 blocked_clients] 0
- r client unpause
- $rd close
- }
-
- test "Test old pause-all takes precedence over new pause-write (less restrictive)" {
- # Scenario:
- # 1. Run 'PAUSE ALL' for 200msec
- # 2. Run 'PAUSE WRITE' for 10 msec
- # 3. Wait 50msec
- # 4. 'GET FOO'.
- # Expected that:
- # - While the time of the second 'PAUSE' is shorter than first 'PAUSE',
- # pause-client feature will stick to the longer one, i.e, will be paused
- # up to 200msec.
- # - The GET command will be postponed ~200msec, even though last command
- # paused only WRITE. This is because the first 'PAUSE ALL' command is
- # more restrictive than the second 'PAUSE WRITE' and pause-client feature
- # preserve most restrictive configuration among multiple settings.
- set rd [redis_deferring_client]
- $rd SET FOO BAR
- $rd read
-
- set test_start_time [clock milliseconds]
- r client PAUSE 200 ALL
- r client PAUSE 20 WRITE
- after 50
- $rd get FOO
- $rd read
- set elapsed [expr {[clock milliseconds]-$test_start_time}]
- assert_lessthan 200 $elapsed
- $rd close
- }
-
- test "Test new pause time is smaller than old one, then old time preserved" {
- r client PAUSE 60000 WRITE
- r client PAUSE 10 WRITE
- after 100
- set rd [redis_deferring_client]
- $rd SET FOO BAR
- wait_for_blocked_clients_count 1 100 10
-
- r client unpause
- assert_match "OK" [$rd read]
- $rd close
- }
-
- test "Test write commands are paused by RO" {
- r client PAUSE 60000 WRITE
-
- set rd [redis_deferring_client]
- $rd SET FOO BAR
- wait_for_blocked_clients_count 1 50 100
-
- r client unpause
- assert_match "OK" [$rd read]
- $rd close
- }
-
- test "Test special commands are paused by RO" {
- r PFADD pause-hll test
- r client PAUSE 100000 WRITE
-
- # Test that pfcount, which can replicate, is also blocked
- set rd [redis_deferring_client]
- $rd PFCOUNT pause-hll
- wait_for_blocked_clients_count 1 50 100
-
- # Test that publish, which adds the message to the replication
- # stream is blocked.
- set rd2 [redis_deferring_client]
- $rd2 publish foo bar
- wait_for_blocked_clients_count 2 50 100
-
- r client unpause
- assert_match "1" [$rd read]
- assert_match "0" [$rd2 read]
- $rd close
- $rd2 close
- }
-
- test "Test read/admin multi-execs are not blocked by pause RO" {
- r SET FOO BAR
- r client PAUSE 100000 WRITE
- set rr [redis_client]
- assert_equal [$rr MULTI] "OK"
- assert_equal [$rr PING] "QUEUED"
- assert_equal [$rr GET FOO] "QUEUED"
- assert_match "PONG BAR" [$rr EXEC]
- assert_equal [s 0 blocked_clients] 0
- r client unpause
- $rr close
- }
-
- test "Test write multi-execs are blocked by pause RO" {
- set rd [redis_deferring_client]
- $rd MULTI
- assert_equal [$rd read] "OK"
- $rd SET FOO BAR
- assert_equal [$rd read] "QUEUED"
- r client PAUSE 60000 WRITE
- $rd EXEC
- wait_for_blocked_clients_count 1 50 100
- r client unpause
- assert_match "OK" [$rd read]
- $rd close
- }
-
- test "Test scripts are blocked by pause RO" {
- r client PAUSE 60000 WRITE
- set rd [redis_deferring_client]
- set rd2 [redis_deferring_client]
- $rd EVAL "return 1" 0
-
- # test a script with a shebang and no flags for coverage
- $rd2 EVAL {#!lua
- return 1
- } 0
-
- wait_for_blocked_clients_count 2 50 100
- r client unpause
- assert_match "1" [$rd read]
- assert_match "1" [$rd2 read]
- $rd close
- $rd2 close
- }
-
- test "Test RO scripts are not blocked by pause RO" {
- r set x y
- # create a function for later
- r FUNCTION load replace {#!lua name=f1
- redis.register_function{
- function_name='f1',
- callback=function() return "hello" end,
- flags={'no-writes'}
- }
- }
-
- r client PAUSE 6000000 WRITE
- set rr [redis_client]
-
- # test an eval that's for sure not in the script cache
- assert_equal [$rr EVAL {#!lua flags=no-writes
- return 'unique script'
- } 0
- ] "unique script"
-
- # for sanity, repeat that EVAL on a script that's already cached
- assert_equal [$rr EVAL {#!lua flags=no-writes
- return 'unique script'
- } 0
- ] "unique script"
-
- # test EVAL_RO on a unique script that's for sure not in the cache
- assert_equal [$rr EVAL_RO {
- return redis.call('GeT', 'x')..' unique script'
- } 1 x
- ] "y unique script"
-
- # test with evalsha
- set sha [$rr script load {#!lua flags=no-writes
- return 2
- }]
- assert_equal [$rr EVALSHA $sha 0] 2
-
- # test with function
- assert_equal [$rr fcall f1 0] hello
-
- r client unpause
- $rr close
- }
-
- test "Test read-only scripts in multi-exec are not blocked by pause RO" {
- r SET FOO BAR
- r client PAUSE 100000 WRITE
- set rr [redis_client]
- assert_equal [$rr MULTI] "OK"
- assert_equal [$rr EVAL {#!lua flags=no-writes
- return 12
- } 0
- ] QUEUED
- assert_equal [$rr EVAL {#!lua flags=no-writes
- return 13
- } 0
- ] QUEUED
- assert_match "12 13" [$rr EXEC]
- assert_equal [s 0 blocked_clients] 0
- r client unpause
- $rr close
- }
-
- test "Test write scripts in multi-exec are blocked by pause RO" {
- set rd [redis_deferring_client]
- set rd2 [redis_deferring_client]
-
- # one with a shebang
- $rd MULTI
- assert_equal [$rd read] "OK"
- $rd EVAL {#!lua
- return 12
- } 0
- assert_equal [$rd read] "QUEUED"
-
- # one without a shebang
- $rd2 MULTI
- assert_equal [$rd2 read] "OK"
- $rd2 EVAL {#!lua
- return 13
- } 0
- assert_equal [$rd2 read] "QUEUED"
-
- r client PAUSE 60000 WRITE
- $rd EXEC
- $rd2 EXEC
- wait_for_blocked_clients_count 2 50 100
- r client unpause
- assert_match "12" [$rd read]
- assert_match "13" [$rd2 read]
- $rd close
- $rd2 close
- }
-
- test "Test may-replicate commands are rejected in RO scripts" {
- # that's specifically important for CLIENT PAUSE WRITE
- assert_error {ERR Write commands are not allowed from read-only scripts. script:*} {
- r EVAL_RO "return redis.call('publish','ch','msg')" 0
- }
- assert_error {ERR Write commands are not allowed from read-only scripts. script:*} {
- r EVAL {#!lua flags=no-writes
- return redis.call('publish','ch','msg')
- } 0
- }
- # make sure that publish isn't blocked from a non-RO script
- assert_equal [r EVAL "return redis.call('publish','ch','msg')" 0] 0
- }
-
- test "Test multiple clients can be queued up and unblocked" {
- r client PAUSE 60000 WRITE
- set clients [list [redis_deferring_client] [redis_deferring_client] [redis_deferring_client]]
- foreach client $clients {
- $client SET FOO BAR
- }
-
- wait_for_blocked_clients_count 3 50 100
- r client unpause
- foreach client $clients {
- assert_match "OK" [$client read]
- $client close
- }
- }
-
- test "Test clients with syntax errors will get responses immediately" {
- r client PAUSE 100000 WRITE
- catch {r set FOO} err
- assert_match "ERR wrong number of arguments for 'set' command" $err
- r client unpause
- }
-
- test "Test both active and passive expires are skipped during client pause" {
- set expired_keys [s 0 expired_keys]
- r multi
- r set foo{t} bar{t} PX 10
- r set bar{t} foo{t} PX 10
- r client PAUSE 50000 WRITE
- r exec
-
- wait_for_condition 10 100 {
- [r get foo{t}] == {} && [r get bar{t}] == {}
- } else {
- fail "Keys were never logically expired"
- }
-
- # No keys should actually have been expired
- assert_match $expired_keys [s 0 expired_keys]
-
- r client unpause
-
- # Force the keys to expire
- r get foo{t}
- r get bar{t}
-
- # Now that clients have been unpaused, expires should go through
- assert_match [expr $expired_keys + 2] [s 0 expired_keys]
- }
-
- test "Test that client pause starts at the end of a transaction" {
- r MULTI
- r SET FOO1{t} BAR
- r client PAUSE 60000 WRITE
- r SET FOO2{t} BAR
- r exec
-
- set rd [redis_deferring_client]
- $rd SET FOO3{t} BAR
-
- wait_for_blocked_clients_count 1 50 100
-
- assert_match "BAR" [r GET FOO1{t}]
- assert_match "BAR" [r GET FOO2{t}]
- assert_match "" [r GET FOO3{t}]
-
- r client unpause
- assert_match "OK" [$rd read]
- $rd close
- }
-
- start_server {tags {needs:repl external:skip}} {
- set master [srv -1 client]
- set master_host [srv -1 host]
- set master_port [srv -1 port]
-
- # Avoid PINGs
- $master config set repl-ping-replica-period 3600
- r replicaof $master_host $master_port
-
- wait_for_condition 50 100 {
- [s master_link_status] eq {up}
- } else {
- fail "Replication not started."
- }
-
- test "Test when replica paused, offset would not grow" {
- $master set foo bar
- set old_master_offset [status $master master_repl_offset]
-
- wait_for_condition 50 100 {
- [s slave_repl_offset] == [status $master master_repl_offset]
- } else {
- fail "Replication offset not matched."
- }
-
- r client pause 100000 write
- $master set foo2 bar2
-
- # Make sure replica received data from master
- wait_for_condition 50 100 {
- [s slave_read_repl_offset] == [status $master master_repl_offset]
- } else {
- fail "Replication not work."
- }
-
- # Replica would not apply the write command
- assert {[s slave_repl_offset] == $old_master_offset}
- r get foo2
- } {}
-
- test "Test replica offset would grow after unpause" {
- r client unpause
- wait_for_condition 50 100 {
- [s slave_repl_offset] == [status $master master_repl_offset]
- } else {
- fail "Replication not continue."
- }
- r get foo2
- } {bar2}
- }
-
- test "Test the randomkey command will not cause the server to get into an infinite loop during the client pause write" {
- r flushall
-
- r multi
- r set key value px 3
- r client pause 10000 write
- r exec
-
- after 5
-
- wait_for_condition 50 100 {
- [r randomkey] == "key"
- } else {
- fail "execute randomkey failed, caused by the infinite loop"
- }
-
- r client unpause
- assert_equal [r randomkey] {}
- }
-
- test "CLIENT UNBLOCK is not allow to unblock client blocked by CLIENT PAUSE" {
- set rd1 [redis_deferring_client]
- set rd2 [redis_deferring_client]
- $rd1 client id
- $rd2 client id
- set client_id1 [$rd1 read]
- set client_id2 [$rd2 read]
-
- r del mylist
- r client pause 100000 write
- $rd1 blpop mylist 0
- $rd2 blpop mylist 0
- wait_for_blocked_clients_count 2 50 100
-
- # This used to trigger a panic.
- assert_equal 0 [r client unblock $client_id1 timeout]
- # This used to return a UNBLOCKED error.
- assert_equal 0 [r client unblock $client_id2 error]
-
- # After the unpause, it must be able to unblock the client.
- r client unpause
- assert_equal 1 [r client unblock $client_id1 timeout]
- assert_equal 1 [r client unblock $client_id2 error]
- assert_equal {} [$rd1 read]
- assert_error "UNBLOCKED*" {$rd2 read}
-
- $rd1 close
- $rd2 close
- }
-
- # Make sure we unpause at the end
- r client unpause
-}