diff options
author | Madelyn Olson <34459052+madolson@users.noreply.github.com> | 2022-04-26 03:25:33 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-26 13:25:33 +0300 |
commit | 6fa8e4f7afcbd14748c736c38e5fbc117eaef7ba (patch) | |
tree | e74b7ddf889b99daadd615cbee5ca069e14c82bb /tests | |
parent | efcd1bf394668e418df1a93cd28cf9e8b0c09ce5 (diff) | |
download | redis-6fa8e4f7afcbd14748c736c38e5fbc117eaef7ba.tar.gz |
Set replicas to panic on disk errors, and optionally panic on replication errors (#10504)
* Till now, replicas that were unable to persist, would still execute the commands
they got from the master, now they'll panic by default, and we add a new
`replica-ignore-disk-errors` config to change that.
* Till now, when a command failed on a replica or AOF-loading, it only logged a
warning and a stat, we add a new `propagation-error-behavior` config to allow
panicking in that state (may become the default one day)
Note that commands that fail on the replica can either indicate a bug that could
cause data inconsistency between the replica and the master, or they could be
in some cases (specifically in previous versions), a result of a command (e.g. EVAL)
that failed on the master, but still had to be propagated to fail on the replica as well.
Diffstat (limited to 'tests')
-rw-r--r-- | tests/assets/default.conf | 2 | ||||
-rw-r--r-- | tests/integration/replication-4.tcl | 45 |
2 files changed, 47 insertions, 0 deletions
diff --git a/tests/assets/default.conf b/tests/assets/default.conf index 42297903f..227ab5e7f 100644 --- a/tests/assets/default.conf +++ b/tests/assets/default.conf @@ -30,3 +30,5 @@ activerehashing yes enable-protected-configs yes enable-debug-command yes enable-module-command yes + +propagation-error-behavior panic
\ No newline at end of file diff --git a/tests/integration/replication-4.tcl b/tests/integration/replication-4.tcl index 281d5a8eb..9f4281f7c 100644 --- a/tests/integration/replication-4.tcl +++ b/tests/integration/replication-4.tcl @@ -195,3 +195,48 @@ start_server {tags {"repl external:skip"}} { } } } + +start_server {tags {"repl external:skip"}} { + start_server {} { + set master [srv -1 client] + set master_host [srv -1 host] + set master_port [srv -1 port] + set replica [srv 0 client] + + test {First server should have role slave after SLAVEOF} { + $replica slaveof $master_host $master_port + wait_for_condition 50 100 { + [s 0 role] eq {slave} + } else { + fail "Replication not started." + } + wait_for_sync $replica + } + + test {Data divergence can happen under default conditions} { + $replica config set propagation-error-behavior ignore + $master debug replicate fake-command-1 + + # Wait for replication to normalize + $master set foo bar2 + $master wait 1 2000 + + # Make sure we triggered the error, by finding the critical + # message and the fake command. + assert_equal [count_log_message 0 "fake-command-1"] 1 + assert_equal [count_log_message 0 "== CRITICAL =="] 1 + } + + test {Data divergence is allowed on writable replicas} { + $replica config set replica-read-only no + $replica set number2 foo + $master incrby number2 1 + $master wait 1 2000 + + assert_equal [$master get number2] 1 + assert_equal [$replica get number2] foo + + assert_equal [count_log_message 0 "incrby"] 1 + } + } +} |