mirror of https://mirror.osredm.com/root/redis.git
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 34505d26f7
)
This commit is contained in:
parent
5895d119b1
commit
2adbbbcdc0
|
@ -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"}} {
|
||||||
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*}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue