From cd05a665dc1dded3cfbc78ceaa5a5d00381f0ad7 Mon Sep 17 00:00:00 2001 From: antirez Date: Mon, 4 May 2015 11:59:09 +0200 Subject: [PATCH] Update cached time during slow scripts & transactions Commands may use cached time when the precision is not vital. It is a good idea to refresh it from time to time during the execution of long running scripts or transactions composed of quite a lot of commands. --- src/multi.c | 4 ++++ src/scripting.c | 3 ++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/src/multi.c b/src/multi.c index c8287645..05805310 100644 --- a/src/multi.c +++ b/src/multi.c @@ -162,6 +162,10 @@ void execCommand(redisClient *c) { c->mstate.commands[j].argc = c->argc; c->mstate.commands[j].argv = c->argv; c->mstate.commands[j].cmd = c->cmd; + + /* From time to time, update the cached time so that if the transaction + * is huge, we'll have a chance to have more updated time info. */ + if (j && j % 10000) updateCachedTime(); } c->argv = orig_argv; c->argc = orig_argc; diff --git a/src/scripting.c b/src/scripting.c index 46c0de9a..3bad4d07 100644 --- a/src/scripting.c +++ b/src/scripting.c @@ -527,7 +527,8 @@ void luaMaskCountHook(lua_State *lua, lua_Debug *ar) { REDIS_NOTUSED(ar); REDIS_NOTUSED(lua); - elapsed = mstime() - server.lua_time_start; + updateCachedTime(); + elapsed = server.mstime - server.lua_time_start; if (elapsed >= server.lua_time_limit && server.lua_timedout == 0) { redisLog(REDIS_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;