summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVo Trong Phuc <38036797+noradomi@users.noreply.github.com>2022-04-11 16:59:27 +0700
committerOran Agra <oran@redislabs.com>2023-01-17 14:59:41 +0200
commit2adbbbcdc0797ff9bb8f21e7fb65fea943bd00b5 (patch)
tree8e7f1996104685086962b2419667489ada4bb652
parent5895d119b1c2825ff0394f30e246e036c3972bc5 (diff)
downloadredis-2adbbbcdc0797ff9bb8f21e7fb65fea943bd00b5.tar.gz
add check good slaves to write when execute script (#10249)
There was no check min-slave-* config when evaluating Lua script. Add check enough good slaves for write command when evaluating scripts. Co-authored-by: Phuc. Vo Trong <phucvt@vng.com.vn> (cherry picked from commit 34505d26f74a33a14b405746aa8feffdfe24f807)
-rw-r--r--src/scripting.c7
-rw-r--r--tests/integration/replication-4.tcl29
2 files changed, 27 insertions, 9 deletions
diff --git a/src/scripting.c b/src/scripting.c
index afa6adb0c..5c96a3604 100644
--- a/src/scripting.c
+++ b/src/scripting.c
@@ -676,6 +676,13 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
sdsfree(aof_write_err);
}
goto cleanup;
+ } else if (server.masterhost == NULL &&
+ server.repl_min_slaves_max_lag &&
+ server.repl_min_slaves_to_write &&
+ server.repl_good_slaves_count < server.repl_min_slaves_to_write)
+ {
+ luaPushError(lua, shared.noreplicaserr->ptr);
+ goto cleanup;
}
}
diff --git a/tests/integration/replication-4.tcl b/tests/integration/replication-4.tcl
index 8071c4f97..69f02ef03 100644
--- a/tests/integration/replication-4.tcl
+++ b/tests/integration/replication-4.tcl
@@ -65,26 +65,37 @@ start_server {tags {"repl"}} {
test {With min-slaves-to-write (1,3): master should be writable} {
$master config set min-slaves-max-lag 3
$master config set min-slaves-to-write 1
- $master set foo bar
- } {OK}
+ assert_equal OK [$master set foo 123]
+ assert_equal OK [$master eval "return redis.call('set','foo',12345)" 0]
+ }
test {With min-slaves-to-write (2,3): master should not be writable} {
$master config set min-slaves-max-lag 3
$master config set min-slaves-to-write 2
- catch {$master set foo bar} e
- set e
- } {NOREPLICAS*}
+ assert_error "*NOREPLICAS*" {$master set foo bar}
+ assert_error "*NOREPLICAS*" {$master eval "redis.call('set','foo','bar')" 0}
+ }
+
+ test {With not enough good slaves, read in Lua script is still accepted} {
+ $master config set min-slaves-max-lag 3
+ $master config set min-slaves-to-write 1
+ $master eval "redis.call('set','foo','bar')" 0
+
+ $master config set min-slaves-to-write 2
+ $master eval "return redis.call('get','foo')" 0
+ } {bar}
test {With min-slaves-to-write: master not writable with lagged slave} {
$master config set min-slaves-max-lag 2
$master config set min-slaves-to-write 1
- assert {[$master set foo bar] eq {OK}}
+ assert_equal OK [$master set foo 123]
+ assert_equal OK [$master eval "return redis.call('set','foo',12345)" 0]
$slave deferred 1
$slave debug sleep 6
after 4000
- catch {$master set foo bar} e
- set e
- } {NOREPLICAS*}
+ assert_error "*NOREPLICAS*" {$master set foo 123}
+ assert_error "*NOREPLICAS*" {$master eval "return redis.call('set','foo',12345)" 0}
+ }
}
}