diff options
author | Vo Trong Phuc <38036797+noradomi@users.noreply.github.com> | 2022-04-11 16:59:27 +0700 |
---|---|---|
committer | Oran Agra <oran@redislabs.com> | 2023-01-17 14:59:41 +0200 |
commit | 2adbbbcdc0797ff9bb8f21e7fb65fea943bd00b5 (patch) | |
tree | 8e7f1996104685086962b2419667489ada4bb652 | |
parent | 5895d119b1c2825ff0394f30e246e036c3972bc5 (diff) | |
download | redis-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.c | 7 | ||||
-rw-r--r-- | tests/integration/replication-4.tcl | 29 |
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} + } } } |