diff options
author | antirez <antirez@gmail.com> | 2018-08-29 18:14:46 +0200 |
---|---|---|
committer | antirez <antirez@gmail.com> | 2018-09-04 12:53:35 +0200 |
commit | adc4e031bf4544da4af2423df28e2f57397bc2bd (patch) | |
tree | f1d9fb384a73edd6313b84603e73426a167529d3 | |
parent | 20ec1f0cedcd8e40a065d960e3de9a07b4f1c4d0 (diff) | |
download | redis-adc4e031bf4544da4af2423df28e2f57397bc2bd.tar.gz |
Allow scripts to timeout on slaves as well.
See reasoning in #5297.
-rw-r--r-- | src/scripting.c | 12 | ||||
-rw-r--r-- | src/server.c | 1 |
2 files changed, 10 insertions, 3 deletions
diff --git a/src/scripting.c b/src/scripting.c index 9afc08a94..c3ee0f971 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -1222,12 +1222,18 @@ sds luaCreateFunction(client *c, lua_State *lua, robj *body) { /* This is the Lua script "count" hook that we use to detect scripts timeout. */ void luaMaskCountHook(lua_State *lua, lua_Debug *ar) { - long long elapsed; + long long elapsed = mstime() - server.lua_time_start; UNUSED(ar); UNUSED(lua); - elapsed = mstime() - server.lua_time_start; - if (elapsed >= server.lua_time_limit && server.lua_timedout == 0) { + /* The conditions to timeout are: + * 1. The caller is not our master. + * 2. The timeout was reached. + * 3. We are not already timed out. */ + if (!(server.lua_caller->flags & CLIENT_MASTER) && + elapsed >= server.lua_time_limit && + server.lua_timedout == 0) + { serverLog(LL_WARNING,"Lua slow script detected: still in execution after %lld milliseconds. You can try killing the script using the SCRIPT KILL command.",elapsed); server.lua_timedout = 1; /* Once the script timeouts we reenter the event loop to permit others diff --git a/src/server.c b/src/server.c index 55bcb4dc2..1afc9a802 100644 --- a/src/server.c +++ b/src/server.c @@ -2683,6 +2683,7 @@ int processCommand(client *c) { /* Lua script too slow? Only allow a limited number of commands. */ if (server.lua_timedout && + !(c->flags & CLIENT_MASTER) && c->cmd->proc != authCommand && c->cmd->proc != replconfCommand && !(c->cmd->proc == shutdownCommand && |