summaryrefslogtreecommitdiff
path: root/examples/redis-unstable/tests/unit/wait.tcl
diff options
context:
space:
mode:
Diffstat (limited to 'examples/redis-unstable/tests/unit/wait.tcl')
-rw-r--r--examples/redis-unstable/tests/unit/wait.tcl528
1 files changed, 0 insertions, 528 deletions
diff --git a/examples/redis-unstable/tests/unit/wait.tcl b/examples/redis-unstable/tests/unit/wait.tcl
deleted file mode 100644
index 7cf849b..0000000
--- a/examples/redis-unstable/tests/unit/wait.tcl
+++ /dev/null
@@ -1,528 +0,0 @@
-source tests/support/cli.tcl
-
-start_server {tags {"wait network external:skip"}} {
-start_server {} {
- set slave [srv 0 client]
- set slave_host [srv 0 host]
- set slave_port [srv 0 port]
- set slave_pid [srv 0 pid]
- set master [srv -1 client]
- set master_host [srv -1 host]
- set master_port [srv -1 port]
-
- test {Setup slave} {
- $slave slaveof $master_host $master_port
- wait_for_condition 50 100 {
- [s 0 master_link_status] eq {up}
- } else {
- fail "Replication not started."
- }
- }
-
- test {WAIT out of range timeout (milliseconds)} {
- # Timeout is parsed as milliseconds by getLongLongFromObjectOrReply().
- # Verify we get out of range message if value is behind LLONG_MAX
- # (decimal value equals to 0x8000000000000000)
- assert_error "*or out of range*" {$master wait 2 9223372036854775808}
-
- # expected to fail by later overflow condition after addition
- # of mstime(). (decimal value equals to 0x7FFFFFFFFFFFFFFF)
- assert_error "*timeout is out of range*" {$master wait 2 9223372036854775807}
-
- assert_error "*timeout is negative*" {$master wait 2 -1}
- }
-
- test {WAIT should acknowledge 1 additional copy of the data} {
- $master set foo 0
- $master incr foo
- $master incr foo
- $master incr foo
- assert {[$master wait 1 5000] == 1}
- assert {[$slave get foo] == 3}
- }
-
- test {WAIT should not acknowledge 2 additional copies of the data} {
- $master incr foo
- assert {[$master wait 2 1000] <= 1}
- }
-
- test {WAIT should not acknowledge 1 additional copy if slave is blocked} {
- pause_process $slave_pid
- $master set foo 0
- $master incr foo
- $master incr foo
- $master incr foo
- assert {[$master wait 1 1000] == 0}
- resume_process $slave_pid
- assert {[$master wait 1 1000] == 1}
- }
-
- test {WAIT implicitly blocks on client pause since ACKs aren't sent} {
- pause_process $slave_pid
- $master multi
- $master incr foo
- $master client pause 10000 write
- $master exec
- assert {[$master wait 1 1000] == 0}
- $master client unpause
- resume_process $slave_pid
- assert {[$master wait 1 1000] == 1}
- }
-
- test {WAIT replica multiple clients unblock - reuse last result} {
- set rd [redis_deferring_client -1]
- set rd2 [redis_deferring_client -1]
-
- pause_process $slave_pid
-
- $rd incr foo
- $rd read
-
- $rd2 incr foo
- $rd2 read
-
- $rd wait 1 0
- $rd2 wait 1 0
- wait_for_blocked_clients_count 2 100 10 -1
-
- resume_process $slave_pid
-
- assert_equal [$rd read] {1}
- assert_equal [$rd2 read] {1}
-
- $rd ping
- assert_equal [$rd read] {PONG}
- $rd2 ping
- assert_equal [$rd2 read] {PONG}
-
- $rd close
- $rd2 close
- }
-}}
-
-
-tags {"wait aof network external:skip"} {
- start_server {overrides {appendonly {yes} auto-aof-rewrite-percentage {0}}} {
- set master [srv 0 client]
-
- test {WAITAOF local copy before fsync} {
- r config set appendfsync no
- $master incr foo
- assert_equal [$master waitaof 1 0 50] {0 0} ;# exits on timeout
- r config set appendfsync everysec
- }
-
- test {WAITAOF local copy everysec} {
- $master incr foo
- assert_equal [$master waitaof 1 0 0] {1 0}
- }
-
- test {WAITAOF local copy with appendfsync always} {
- r config set appendfsync always
- $master incr foo
- assert_equal [$master waitaof 1 0 0] {1 0}
- }
-
- test {WAITAOF local wait and then stop aof} {
- r config set appendfsync no
- set rd [redis_deferring_client]
- $rd incr foo
- $rd read
- $rd waitaof 1 0 0
- wait_for_blocked_client
- r config set appendonly no ;# this should release the blocked client as an error
- assert_error {ERR WAITAOF cannot be used when numlocal is set but appendonly is disabled.} {$rd read}
- $rd close
- }
-
- test {WAITAOF local on server with aof disabled} {
- $master incr foo
- assert_error {ERR WAITAOF cannot be used when numlocal is set but appendonly is disabled.} {$master waitaof 1 0 0}
- }
-
- test {WAITAOF local client unblock with timeout and error} {
- r config set appendonly yes
- r config set appendfsync no
- set rd [redis_deferring_client]
- $rd client id
- set client_id [$rd read]
-
- # Test unblock with timeout
- $rd incr foo
- $rd read
- $rd waitaof 1 0 0
- wait_for_blocked_client
- assert_equal 1 [r client unblock $client_id timeout]
-
- # Test unblock with error
- $rd incr foo
- $rd read
- $rd waitaof 1 0 0
- wait_for_blocked_client
- assert_equal 1 [r client unblock $client_id error]
- $rd close
- }
-
- test {WAITAOF local if AOFRW was postponed} {
- r config set appendfsync everysec
-
- # turn off AOF
- r config set appendonly no
-
- # create an RDB child that takes a lot of time to run
- r set x y
- r config set rdb-key-save-delay 100000000 ;# 100 seconds
- r bgsave
- assert_equal [s rdb_bgsave_in_progress] 1
-
- # turn on AOF
- r config set appendonly yes
- assert_equal [s aof_rewrite_scheduled] 1
-
- # create a write command (to increment master_repl_offset)
- r set x y
-
- # reset save_delay and kill RDB child
- r config set rdb-key-save-delay 0
- catch {exec kill -9 [get_child_pid 0]}
-
- # wait for AOF (will unblock after AOFRW finishes)
- assert_equal [r waitaof 1 0 10000] {1 0}
-
- # make sure AOFRW finished
- assert_equal [s aof_rewrite_in_progress] 0
- assert_equal [s aof_rewrite_scheduled] 0
- }
-
- $master config set appendonly yes
- waitForBgrewriteaof $master
-
- start_server {overrides {appendonly {yes} auto-aof-rewrite-percentage {0}}} {
- set master_host [srv -1 host]
- set master_port [srv -1 port]
- set replica [srv 0 client]
- set replica_host [srv 0 host]
- set replica_port [srv 0 port]
- set replica_pid [srv 0 pid]
-
- # make sure the master always fsyncs first (easier to test)
- $master config set appendfsync always
- $replica config set appendfsync no
-
- test {WAITAOF on demoted master gets unblocked with an error} {
- set rd [redis_deferring_client]
- $rd incr foo
- $rd read
- $rd waitaof 0 1 0
- wait_for_blocked_client
- $replica replicaof $master_host $master_port
- assert_error {UNBLOCKED force unblock from blocking operation,*} {$rd read}
- $rd close
- }
-
- wait_for_ofs_sync $master $replica
-
- test {WAITAOF replica copy before fsync} {
- $master incr foo
- assert_equal [$master waitaof 0 1 50] {1 0} ;# exits on timeout
- }
- $replica config set appendfsync everysec
-
- test {WAITAOF replica copy everysec} {
- $replica config set appendfsync everysec
- waitForBgrewriteaof $replica ;# Make sure there is no AOFRW
-
- $master incr foo
- assert_equal [$master waitaof 0 1 0] {1 1}
- }
-
- test {WAITAOF replica copy everysec with AOFRW} {
- $replica config set appendfsync everysec
-
- # When we trigger an AOFRW, a fsync is triggered when closing the old INCR file,
- # so with the everysec, we will skip that second of fsync, and in the next second
- # after that, we will eventually do the fsync.
- $replica bgrewriteaof
- waitForBgrewriteaof $replica
-
- $master incr foo
- assert_equal [$master waitaof 0 1 0] {1 1}
- }
-
- test {WAITAOF replica copy everysec with slow AOFRW} {
- $replica config set appendfsync everysec
- $replica config set rdb-key-save-delay 1000000 ;# 1 sec
-
- $replica bgrewriteaof
-
- $master incr foo
- assert_equal [$master waitaof 0 1 0] {1 1}
-
- $replica config set rdb-key-save-delay 0
- waitForBgrewriteaof $replica
- }
-
- test {WAITAOF replica copy everysec->always with AOFRW} {
- $replica config set appendfsync everysec
-
- # Try to fit all of them in the same round second, although there's no way to guarantee
- # that, it can be done on fast machine. In any case, the test shouldn't fail either.
- $replica bgrewriteaof
- $master incr foo
- waitForBgrewriteaof $replica
- $replica config set appendfsync always
-
- assert_equal [$master waitaof 0 1 0] {1 1}
- }
-
- test {WAITAOF replica copy appendfsync always} {
- $replica config set appendfsync always
- $master incr foo
- assert_equal [$master waitaof 0 1 0] {1 1}
- $replica config set appendfsync everysec
- }
-
- test {WAITAOF replica copy if replica is blocked} {
- pause_process $replica_pid
- $master incr foo
- assert_equal [$master waitaof 0 1 50] {1 0} ;# exits on timeout
- resume_process $replica_pid
- assert_equal [$master waitaof 0 1 0] {1 1}
- }
-
- test {WAITAOF replica multiple clients unblock - reuse last result} {
- set rd [redis_deferring_client -1]
- set rd2 [redis_deferring_client -1]
-
- pause_process $replica_pid
-
- $rd incr foo
- $rd read
-
- $rd2 incr foo
- $rd2 read
-
- $rd waitaof 0 1 0
- $rd2 waitaof 0 1 0
- wait_for_blocked_clients_count 2 100 10 -1
-
- resume_process $replica_pid
-
- assert_equal [$rd read] {1 1}
- assert_equal [$rd2 read] {1 1}
-
- $rd ping
- assert_equal [$rd read] {PONG}
- $rd2 ping
- assert_equal [$rd2 read] {PONG}
-
- $rd close
- $rd2 close
- }
-
- test {WAITAOF on promoted replica} {
- $replica replicaof no one
- $replica incr foo
- assert_equal [$replica waitaof 1 0 0] {1 0}
- }
-
- test {WAITAOF master that loses a replica and backlog is dropped} {
- $master config set repl-backlog-ttl 1
- after 2000 ;# wait for backlog to expire
- $master incr foo
- assert_equal [$master waitaof 1 0 0] {1 0}
- }
-
- test {WAITAOF master without backlog, wait is released when the replica finishes full-sync} {
- set rd [redis_deferring_client -1]
- $rd incr foo
- $rd read
- $rd waitaof 0 1 0
- wait_for_blocked_client -1
- $replica replicaof $master_host $master_port
- assert_equal [$rd read] {1 1}
- $rd close
- }
-
- test {WAITAOF master isn't configured to do AOF} {
- $master config set appendonly no
- $master incr foo
- assert_equal [$master waitaof 0 1 0] {0 1}
- }
-
- test {WAITAOF replica isn't configured to do AOF} {
- $master config set appendonly yes
- waitForBgrewriteaof $master
- $replica config set appendonly no
- $master incr foo
- assert_equal [$master waitaof 1 0 0] {1 0}
- }
-
- test {WAITAOF both local and replica got AOF enabled at runtime} {
- $replica config set appendonly yes
- waitForBgrewriteaof $replica
- $master incr foo
- assert_equal [$master waitaof 1 1 0] {1 1}
- }
-
- test {WAITAOF master sends PING after last write} {
- $master config set repl-ping-replica-period 1
- $master incr foo
- after 1200 ;# wait for PING
- $master get foo
- assert_equal [$master waitaof 1 1 0] {1 1}
- $master config set repl-ping-replica-period 10
- }
-
- test {WAITAOF master client didn't send any write command} {
- $master config set repl-ping-replica-period 1
- set client [redis_client -1]
- after 1200 ;# wait for PING
- assert_equal [$master waitaof 1 1 0] {1 1}
- $client close
- $master config set repl-ping-replica-period 10
- }
-
- test {WAITAOF master client didn't send any command} {
- $master config set repl-ping-replica-period 1
- set client [redis [srv -1 "host"] [srv -1 "port"] 0 $::tls]
- after 1200 ;# wait for PING
- assert_equal [$master waitaof 1 1 0] {1 1}
- $client close
- $master config set repl-ping-replica-period 10
- }
-
- foreach fsync {no everysec always} {
- test "WAITAOF when replica switches between masters, fsync: $fsync" {
- # test a case where a replica is moved from one master to the other
- # between two replication streams with different offsets that should
- # not be mixed. done to smoke-test race conditions with bio thread.
- start_server {overrides {appendonly {yes} auto-aof-rewrite-percentage {0}}} {
- start_server {overrides {appendonly {yes} auto-aof-rewrite-percentage {0}}} {
- set master2 [srv -1 client]
- set master2_host [srv -1 host]
- set master2_port [srv -1 port]
- set replica2 [srv 0 client]
- set replica2_host [srv 0 host]
- set replica2_port [srv 0 port]
- set replica2_pid [srv 0 pid]
-
- $replica2 replicaof $master2_host $master2_port
- wait_for_ofs_sync $master2 $replica2
-
- $master config set appendfsync $fsync
- $master2 config set appendfsync $fsync
- $replica config set appendfsync $fsync
- $replica2 config set appendfsync $fsync
- if {$fsync eq "no"} {
- after 2000 ;# wait for any previous fsync to finish
- # can't afford "no" on the masters
- $master config set appendfsync always
- $master2 config set appendfsync always
- } elseif {$fsync eq "everysec"} {
- after 990 ;# hoping to hit a race
- }
-
- # add some writes and block a client on each master
- set rd [redis_deferring_client -3]
- set rd2 [redis_deferring_client -1]
- $rd set boo 11
- $rd2 set boo 22
- $rd read
- $rd2 read
- $rd waitaof 1 1 0
- $rd2 waitaof 1 1 0
-
- if {$fsync eq "no"} {
- # since appendfsync is disabled in the replicas, the client
- # will get released only with full sync
- wait_for_blocked_client -1
- wait_for_blocked_client -3
- }
- # switch between the two replicas
- $replica2 replicaof $master_host $master_port
- $replica replicaof $master2_host $master2_port
- assert_equal [$rd read] {1 1}
- assert_equal [$rd2 read] {1 1}
- $rd close
- $rd2 close
-
- assert_equal [$replica get boo] 22
- assert_equal [$replica2 get boo] 11
- }
- }
- }
- }
- }
- }
-}
-
-start_server {tags {"failover external:skip"}} {
-start_server {} {
-start_server {} {
- set master [srv 0 client]
- set master_host [srv 0 host]
- set master_port [srv 0 port]
-
- set replica1 [srv -1 client]
- set replica1_pid [srv -1 pid]
-
- set replica2 [srv -2 client]
-
- test {setup replication for following tests} {
- $replica1 replicaof $master_host $master_port
- $replica2 replicaof $master_host $master_port
- wait_for_sync $replica1
- wait_for_sync $replica2
- }
-
- test {WAIT and WAITAOF replica multiple clients unblock - reuse last result} {
- set rd [redis_deferring_client]
- set rd2 [redis_deferring_client]
-
- $master config set appendonly yes
- $replica1 config set appendonly yes
- $replica2 config set appendonly yes
-
- $master config set appendfsync always
- $replica1 config set appendfsync no
- $replica2 config set appendfsync no
-
- waitForBgrewriteaof $master
- waitForBgrewriteaof $replica1
- waitForBgrewriteaof $replica2
-
- pause_process $replica1_pid
-
- $rd incr foo
- $rd read
- $rd waitaof 0 1 0
-
- # rd2 has a newer repl_offset
- $rd2 incr foo
- $rd2 read
- $rd2 wait 2 0
-
- wait_for_blocked_clients_count 2
-
- resume_process $replica1_pid
-
- # WAIT will unblock the client first.
- assert_equal [$rd2 read] {2}
-
- # Make $replica1 catch up the repl_aof_off, then WAITAOF will unblock the client.
- $replica1 config set appendfsync always
- $master incr foo
- assert_equal [$rd read] {1 1}
-
- $rd ping
- assert_equal [$rd read] {PONG}
- $rd2 ping
- assert_equal [$rd2 read] {PONG}
-
- $rd close
- $rd2 close
- }
-}
-}
-}