Commit 2adbbbcd authored by Vo Trong Phuc's avatar Vo Trong Phuc Committed by Oran Agra
Browse files

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: default avatarPhuc. Vo Trong <phucvt@vng.com.vn>
(cherry picked from commit 34505d26)
parent 5895d119
...@@ -676,6 +676,13 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) { ...@@ -676,6 +676,13 @@ int luaRedisGenericCommand(lua_State *lua, int raise_error) {
sdsfree(aof_write_err); sdsfree(aof_write_err);
} }
goto cleanup; 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;
} }
} }
......
...@@ -65,26 +65,37 @@ start_server {tags {"repl"}} { ...@@ -65,26 +65,37 @@ start_server {tags {"repl"}} {
test {With min-slaves-to-write (1,3): master should be writable} { 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-max-lag 3
$master config set min-slaves-to-write 1 $master config set min-slaves-to-write 1
$master set foo bar assert_equal OK [$master set foo 123]
} {OK} 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} { 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-max-lag 3
$master config set min-slaves-to-write 2 $master config set min-slaves-to-write 2
catch {$master set foo bar} e assert_error "*NOREPLICAS*" {$master set foo bar}
set e assert_error "*NOREPLICAS*" {$master eval "redis.call('set','foo','bar')" 0}
} {NOREPLICAS*} }
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} { 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-max-lag 2
$master config set min-slaves-to-write 1 $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 deferred 1
$slave debug sleep 6 $slave debug sleep 6
after 4000 after 4000
catch {$master set foo bar} e assert_error "*NOREPLICAS*" {$master set foo 123}
set e assert_error "*NOREPLICAS*" {$master eval "return redis.call('set','foo',12345)" 0}
} {NOREPLICAS*} }
} }
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment