diff --git a/src/lua/session.cc b/src/lua/session.cc index 45a97ba6b7474d13dffff85eedea8a75d44dd9f4..05a21ce4baa85314de40c59b3cafe0b3ca6c79c8 100644 --- a/src/lua/session.cc +++ b/src/lua/session.cc @@ -179,21 +179,21 @@ lbox_session_on_disconnect(struct lua_State *L) void session_storage_cleanup(int sid) { - int top = lua_gettop(root_L); - lua_pushliteral(root_L, "box"); - lua_rawget(root_L, LUA_GLOBALSINDEX); - - lua_pushliteral(root_L, "session"); - lua_rawget(root_L, -2); + static int ref = LUA_REFNIL; - lua_getmetatable(root_L, -1); + int top = lua_gettop(root_L); - lua_pushliteral(root_L, "aggregate_storage"); - lua_rawget(root_L, -2); + if (ref == LUA_REFNIL) { + lua_getfield(root_L, LUA_GLOBALSINDEX, "box"); + lua_getfield(root_L, -1, "session"); + lua_getmetatable(root_L, -1); + lua_getfield(root_L, -1, "aggregate_storage"); + ref = luaL_ref(root_L, LUA_REGISTRYINDEX); + } + lua_rawgeti(root_L, LUA_REGISTRYINDEX, ref); lua_pushnil(root_L); lua_rawseti(root_L, -2, sid); - lua_settop(root_L, top); }