mirror of
https://github.com/redis/redis.git
synced 2026-04-21 03:01:35 -04:00
Ensure that the function load timeout is disabled during loading from RDB/AOF and on replicas. (#12451)
When loading a function from either RDB/AOF or a replica, it is essential not to fail on timeout errors. The loading time may vary due to various factors, such as hardware specifications or the system's workload during the loading process. Once a function has been successfully loaded, it should be allowed to load from persistence or on replicas without encountering a timeout failure. To maintain a clear separation between the engine and Redis internals, the implementation refrains from directly checking the state of Redis within the engine itself. Instead, the engine receives the desired timeout as part of the library creation and duly respects this timeout value. If Redis wishes to disable any timeout, it can simply send a value of 0.
This commit is contained in:
committed by
GitHub
parent
90ab91f00b
commit
2ee1bbb53b
@@ -51,7 +51,6 @@
|
||||
#define REGISTRY_LOAD_CTX_NAME "__LIBRARY_CTX__"
|
||||
#define LIBRARY_API_NAME "__LIBRARY_API__"
|
||||
#define GLOBALS_API_NAME "__GLOBALS_API__"
|
||||
#define LOAD_TIMEOUT_MS 500
|
||||
|
||||
/* Lua engine ctx */
|
||||
typedef struct luaEngineCtx {
|
||||
@@ -67,6 +66,7 @@ typedef struct luaFunctionCtx {
|
||||
typedef struct loadCtx {
|
||||
functionLibInfo *li;
|
||||
monotime start_time;
|
||||
size_t timeout;
|
||||
} loadCtx;
|
||||
|
||||
typedef struct registerFunctionArgs {
|
||||
@@ -85,7 +85,7 @@ static void luaEngineLoadHook(lua_State *lua, lua_Debug *ar) {
|
||||
loadCtx *load_ctx = luaGetFromRegistry(lua, REGISTRY_LOAD_CTX_NAME);
|
||||
serverAssert(load_ctx); /* Only supported inside script invocation */
|
||||
uint64_t duration = elapsedMs(load_ctx->start_time);
|
||||
if (duration > LOAD_TIMEOUT_MS) {
|
||||
if (load_ctx->timeout > 0 && duration > load_ctx->timeout) {
|
||||
lua_sethook(lua, luaEngineLoadHook, LUA_MASKLINE, 0);
|
||||
|
||||
luaPushError(lua,"FUNCTION LOAD timeout");
|
||||
@@ -100,7 +100,7 @@ static void luaEngineLoadHook(lua_State *lua, lua_Debug *ar) {
|
||||
*
|
||||
* Return NULL on compilation error and set the error to the err variable
|
||||
*/
|
||||
static int luaEngineCreate(void *engine_ctx, functionLibInfo *li, sds blob, sds *err) {
|
||||
static int luaEngineCreate(void *engine_ctx, functionLibInfo *li, sds blob, size_t timeout, sds *err) {
|
||||
int ret = C_ERR;
|
||||
luaEngineCtx *lua_engine_ctx = engine_ctx;
|
||||
lua_State *lua = lua_engine_ctx->lua;
|
||||
@@ -124,6 +124,7 @@ static int luaEngineCreate(void *engine_ctx, functionLibInfo *li, sds blob, sds
|
||||
loadCtx load_ctx = {
|
||||
.li = li,
|
||||
.start_time = getMonotonicUs(),
|
||||
.timeout = timeout,
|
||||
};
|
||||
luaSaveOnRegistry(lua, REGISTRY_LOAD_CTX_NAME, &load_ctx);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user