mirror of
https://codeberg.org/redict/redict.git
synced 2025-01-23 00:28:26 -05:00
d0819d618e
# replication-3.tcl had a test timeout failure with valgrind on daily CI: ``` *** [err]: SLAVE can reload "lua" AUX RDB fields of duplicated scripts in tests/integration/replication-3.tcl Replication not started. ``` replication took more than 70 seconds. https://github.com/redis/redis/runs/2854037905?check_suite_focus=true on my machine it takes only about 30, but i can see how 50 seconds isn't enough. # replication.tcl loading was over too quickly in freebsd daily CI: ``` *** [err]: slave fails full sync and diskless load swapdb recovers it in tests/integration/replication.tcl Expected '0' to be equal to '1' (context: type eval line 44 cmd {assert_equal [s -1 loading] 1} proc ::start_server) ``` # rdb.tcl loading was over too quickly. increase the time loading takes, and decrease the amount of work we try to achieve in that time.
135 lines
4.9 KiB
Tcl
135 lines
4.9 KiB
Tcl
start_server {tags {"repl external:skip"}} {
|
|
start_server {} {
|
|
test {First server should have role slave after SLAVEOF} {
|
|
r -1 slaveof [srv 0 host] [srv 0 port]
|
|
wait_for_condition 50 100 {
|
|
[s -1 master_link_status] eq {up}
|
|
} else {
|
|
fail "Replication not started."
|
|
}
|
|
}
|
|
|
|
if {$::accurate} {set numops 50000} else {set numops 5000}
|
|
|
|
test {MASTER and SLAVE consistency with expire} {
|
|
createComplexDataset r $numops useexpire
|
|
after 4000 ;# Make sure everything expired before taking the digest
|
|
r keys * ;# Force DEL syntesizing to slave
|
|
after 1000 ;# Wait another second. Now everything should be fine.
|
|
if {[r debug digest] ne [r -1 debug digest]} {
|
|
set csv1 [csvdump r]
|
|
set csv2 [csvdump {r -1}]
|
|
set fd [open /tmp/repldump1.txt w]
|
|
puts -nonewline $fd $csv1
|
|
close $fd
|
|
set fd [open /tmp/repldump2.txt w]
|
|
puts -nonewline $fd $csv2
|
|
close $fd
|
|
puts "Master - Replica inconsistency"
|
|
puts "Run diff -u against /tmp/repldump*.txt for more info"
|
|
}
|
|
assert_equal [r debug digest] [r -1 debug digest]
|
|
}
|
|
|
|
test {Slave is able to evict keys created in writable slaves} {
|
|
r -1 select 5
|
|
assert {[r -1 dbsize] == 0}
|
|
r -1 config set slave-read-only no
|
|
r -1 set key1 1 ex 5
|
|
r -1 set key2 2 ex 5
|
|
r -1 set key3 3 ex 5
|
|
assert {[r -1 dbsize] == 3}
|
|
after 6000
|
|
r -1 dbsize
|
|
} {0}
|
|
}
|
|
}
|
|
|
|
start_server {tags {"repl external:skip"}} {
|
|
start_server {} {
|
|
test {First server should have role slave after SLAVEOF} {
|
|
r -1 slaveof [srv 0 host] [srv 0 port]
|
|
wait_for_condition 50 100 {
|
|
[s -1 master_link_status] eq {up}
|
|
} else {
|
|
fail "Replication not started."
|
|
}
|
|
}
|
|
|
|
set numops 20000 ;# Enough to trigger the Script Cache LRU eviction.
|
|
|
|
# While we are at it, enable AOF to test it will be consistent as well
|
|
# after the test.
|
|
r config set appendonly yes
|
|
|
|
test {MASTER and SLAVE consistency with EVALSHA replication} {
|
|
array set oldsha {}
|
|
for {set j 0} {$j < $numops} {incr j} {
|
|
set key "key:$j"
|
|
# Make sure to create scripts that have different SHA1s
|
|
set script "return redis.call('incr','$key')"
|
|
set sha1 [r eval "return redis.sha1hex(\"$script\")" 0]
|
|
set oldsha($j) $sha1
|
|
r eval $script 0
|
|
set res [r evalsha $sha1 0]
|
|
assert {$res == 2}
|
|
# Additionally call one of the old scripts as well, at random.
|
|
set res [r evalsha $oldsha([randomInt $j]) 0]
|
|
assert {$res > 2}
|
|
|
|
# Trigger an AOF rewrite while we are half-way, this also
|
|
# forces the flush of the script cache, and we will cover
|
|
# more code as a result.
|
|
if {$j == $numops / 2} {
|
|
catch {r bgrewriteaof}
|
|
}
|
|
}
|
|
|
|
wait_for_condition 50 100 {
|
|
[r dbsize] == $numops &&
|
|
[r -1 dbsize] == $numops &&
|
|
[r debug digest] eq [r -1 debug digest]
|
|
} else {
|
|
set csv1 [csvdump r]
|
|
set csv2 [csvdump {r -1}]
|
|
set fd [open /tmp/repldump1.txt w]
|
|
puts -nonewline $fd $csv1
|
|
close $fd
|
|
set fd [open /tmp/repldump2.txt w]
|
|
puts -nonewline $fd $csv2
|
|
close $fd
|
|
puts "Master - Replica inconsistency"
|
|
puts "Run diff -u against /tmp/repldump*.txt for more info"
|
|
}
|
|
|
|
set old_digest [r debug digest]
|
|
r config set appendonly no
|
|
r debug loadaof
|
|
set new_digest [r debug digest]
|
|
assert {$old_digest eq $new_digest}
|
|
}
|
|
|
|
test {SLAVE can reload "lua" AUX RDB fields of duplicated scripts} {
|
|
# Force a Slave full resynchronization
|
|
r debug change-repl-id
|
|
r -1 client kill type master
|
|
|
|
# Check that after a full resync the slave can still load
|
|
# correctly the RDB file: such file will contain "lua" AUX
|
|
# sections with scripts already in the memory of the master.
|
|
|
|
wait_for_condition 1000 100 {
|
|
[s -1 master_link_status] eq {up}
|
|
} else {
|
|
fail "Replication not started."
|
|
}
|
|
|
|
wait_for_condition 50 100 {
|
|
[r debug digest] eq [r -1 debug digest]
|
|
} else {
|
|
fail "DEBUG DIGEST mismatch after full SYNC with many scripts"
|
|
}
|
|
}
|
|
}
|
|
}
|