diff options
Diffstat (limited to 'tests/integration')
-rw-r--r-- | tests/integration/psync2.tcl | 65 | ||||
-rw-r--r-- | tests/integration/replication-3.tcl | 23 |
2 files changed, 86 insertions, 2 deletions
diff --git a/tests/integration/psync2.tcl b/tests/integration/psync2.tcl index d91969e3e..3d9e5527a 100644 --- a/tests/integration/psync2.tcl +++ b/tests/integration/psync2.tcl @@ -10,7 +10,7 @@ start_server {} { # Config set debug_msg 0 ; # Enable additional debug messages - set no_exit 0; ; # Do not exit at end of the test + set no_exit 0 ; # Do not exit at end of the test set duration 20 ; # Total test seconds @@ -175,6 +175,69 @@ start_server {} { assert {$sync_count == $new_sync_count} } + test "PSYNC2: Slave RDB restart with EVALSHA in backlog issue #4483" { + # Pick a random slave + set slave_id [expr {($master_id+1)%5}] + set sync_count [status $R($master_id) sync_full] + + # Make sure to replicate the first EVAL while the salve is online + # so that it's part of the scripts the master believes it's safe + # to propagate as EVALSHA. + $R($master_id) EVAL {return redis.call("incr","__mycounter")} 0 + $R($master_id) EVALSHA e6e0b547500efcec21eddb619ac3724081afee89 0 + + # Wait for the two to sync + wait_for_condition 50 1000 { + [$R($master_id) debug digest] == [$R($slave_id) debug digest] + } else { + fail "Slave not reconnecting" + } + + # Prevent the slave from receiving master updates, and at + # the same time send a new script several times to the + # master, so that we'll end with EVALSHA into the backlog. + $R($slave_id) slaveof 127.0.0.1 0 + + $R($master_id) EVALSHA e6e0b547500efcec21eddb619ac3724081afee89 0 + $R($master_id) EVALSHA e6e0b547500efcec21eddb619ac3724081afee89 0 + $R($master_id) EVALSHA e6e0b547500efcec21eddb619ac3724081afee89 0 + + catch { + $R($slave_id) config rewrite + $R($slave_id) debug restart + } + + # Reconfigure the slave correctly again, when it's back online. + set retry 50 + while {$retry} { + if {[catch { + $R($slave_id) slaveof $master_host $master_port + }]} { + after 1000 + } else { + break + } + incr retry -1 + } + + # The master should be back at 4 slaves eventually + wait_for_condition 50 1000 { + [status $R($master_id) connected_slaves] == 4 + } else { + fail "Slave not reconnecting" + } + set new_sync_count [status $R($master_id) sync_full] + assert {$sync_count == $new_sync_count} + + # However if the slave started with the full state of the + # scripting engine, we should now have the same digest. + wait_for_condition 50 1000 { + [$R($master_id) debug digest] == [$R($slave_id) debug digest] + } else { + fail "Debug digest mismatch between master and slave in post-restart handshake" + } + } + if {$no_exit} { while 1 { puts -nonewline .; flush stdout; after 1000} } diff --git a/tests/integration/replication-3.tcl b/tests/integration/replication-3.tcl index 50dcb9a9a..580be7602 100644 --- a/tests/integration/replication-3.tcl +++ b/tests/integration/replication-3.tcl @@ -100,7 +100,6 @@ start_server {tags {"repl"}} { close $fd puts "Master - Slave inconsistency" puts "Run diff -u against /tmp/repldump*.txt for more info" - } set old_digest [r debug digest] @@ -109,5 +108,27 @@ start_server {tags {"repl"}} { 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 50 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" + } + } } } |