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} + } } }