# HG changeset patch # User Kim Alvefur # Date 1697315553 -7200 # Node ID 6ac5ad578565d21544ccef913fce1f9ac1ac9156 # Parent 9b720c38fee8df4850cffdb1ad0fbdb07c302130 mod_cron: Load last task run time inside task runner to fix async This ensures that all interactions with storage happen inside an async thread, allowing async waiting to be performed in storage drivers. diff -r 9b720c38fee8 -r 6ac5ad578565 plugins/mod_cron.lua --- a/plugins/mod_cron.lua Sun Jul 30 13:03:40 2023 +0200 +++ b/plugins/mod_cron.lua Sat Oct 14 22:32:33 2023 +0200 @@ -12,16 +12,27 @@ local last_run_times = host_module:open_store("cron", "map"); active_hosts[host_module.host] = true; - local function save_task(task, started_at) last_run_times:set(nil, task.id, started_at); end + local function save_task(task, started_at) + last_run_times:set(nil, task.id, started_at); + end + + local function restore_task(task) + if task.last == nil then + task.last = last_run_times:get(nil, task.id); + end + end local function task_added(event) local task = event.item; - if task.name == nil then task.name = task.when; end - if task.id == nil then task.id = event.source.name .. "/" .. task.name:gsub("%W", "_"):lower(); end - if task.last == nil then task.last = last_run_times:get(nil, task.id); end + if task.name == nil then + task.name = task.when; + end + if task.id == nil then + task.id = event.source.name .. "/" .. task.name:gsub("%W", "_"):lower(); + end + task.restore = restore_task; task.save = save_task; - module:log("debug", "%s task %s added, last run %s", task.when, task.id, - task.last and datetime.datetime(task.last) or "never"); + module:log("debug", "%s task %s added", task.when, task.id); return true end @@ -33,12 +44,20 @@ host_module:handle_items("task", task_added, task_removed, true); - function host_module.unload() active_hosts[host_module.host] = nil; end + function host_module.unload() + active_hosts[host_module.host] = nil; + end end -local function should_run(when, last) return not last or last + periods[when] * 0.995 <= os.time() end +local function should_run(when, last) + return not last or last + periods[when] * 0.995 <= os.time() +end local function run_task(task) + task:restore(); + if not should_run(task.when, task.last) then + return + end local started_at = os.time(); task:run(started_at); task.last = started_at; @@ -52,8 +71,7 @@ for host in pairs(active_hosts) do module:log("debug", "Running periodic tasks for host %s", host); for _, task in ipairs(module:context(host):get_host_items("task")) do - module:log("debug", "Considering %s task %s (%s)", task.when, task.id, task.run); - if should_run(task.when, task.last) then task_runner:run(task); end + task_runner:run(task); end end module:log("debug", "Wait %ds", delay); diff -r 9b720c38fee8 -r 6ac5ad578565 teal-src/prosody/plugins/mod_cron.tl --- a/teal-src/prosody/plugins/mod_cron.tl Sun Jul 30 13:03:40 2023 +0200 +++ b/teal-src/prosody/plugins/mod_cron.tl Sat Oct 14 22:32:33 2023 +0200 @@ -42,6 +42,12 @@ last_run_times:set(nil, task.id, started_at); end + local function restore_task(task : task_spec) + if task.last == nil then + task.last = last_run_times:get(nil, task.id); + end + end + local function task_added(event : task_event) : boolean local task = event.item; if task.name == nil then @@ -50,12 +56,9 @@ if task.id == nil then task.id = event.source.name .. "/" .. task.name:gsub("%W", "_"):lower(); end - if task.last == nil then - task.last = last_run_times:get(nil, task.id); - end + task.restore = restore_task; task.save = save_task; - module:log("debug", "%s task %s added, last run %s", task.when, task.id, - task.last and datetime.datetime(task.last) or "never"); + module:log("debug", "%s task %s added", task.when, task.id); return true; end @@ -77,6 +80,10 @@ end local function run_task(task : task_spec) + task:restore(); + if not should_run(task.when, task.last) then + return; + end local started_at = os.time(); task:run(started_at); task.last = started_at; @@ -90,8 +97,7 @@ for host in pairs(active_hosts) do module:log("debug", "Running periodic tasks for host %s", host); for _, task in ipairs(module:context(host):get_host_items("task") as { task_spec } ) do - module:log("debug", "Considering %s task %s (%s)", task.when, task.id, task.run); - if should_run(task.when, task.last) then task_runner:run(task); end + task_runner:run(task); end end module:log("debug", "Wait %ds", delay);