1
0
Fork 0
knot-resolver/modules/detect_time_jump/detect_time_jump.lua
Daniel Baumann fbc604e215
Adding upstream version 5.7.5.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
2025-06-21 13:56:17 +02:00

45 lines
1.4 KiB
Lua

-- SPDX-License-Identifier: GPL-3.0-or-later
-- Module interface
local ffi = require('ffi')
local mod = {}
mod.threshold = 10 * min
local event_id = nil
-- Get time of last cache clear. Compute difference between realtime
-- and monotonic time. Compute difference of actual realtime and monotonic
-- time. In ideal case these differences should be almost same.
-- If they differ more than mod.threshold value then clear cache.
local function check_time()
local checkpoint = cache.checkpoint()
local cache_timeshift = checkpoint.walltime.sec * 1000 - checkpoint.monotime
local actual_timeshift = os.time() * 1000 - tonumber(ffi.C.kr_now())
local jump_backward = cache_timeshift - actual_timeshift
if jump_backward > mod.threshold then
log_info(ffi.C.LOG_GRP_DETECTTIMEJUMP, "Detected backwards time jump, clearing cache.\n" ..
"But what does that mean? It means your future hasn't been written yet."
)
cache.clear()
elseif -jump_backward > mod.threshold then
-- On Linux 4.17+ this shouldn't happen anymore: https://lwn.net/Articles/751482/
log_info(ffi.C.LOG_GRP_DETECTTIMEJUMP, "Detected forward time jump. (Suspend-resume, possibly.)")
cache.checkpoint(true)
end
end
function mod.init()
if event_id then
error("Module is already loaded.")
else
event_id = event.recurrent(1 * min , check_time)
end
end
function mod.deinit()
if event_id then
event.cancel(event_id)
event_id = nil
end
end
return mod