diff options
author | Kim Alvefur <zash@zash.se> | 2023-10-14 22:32:33 +0200 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2023-10-14 22:32:33 +0200 |
commit | 9f21d5487cb0291a156f9866bf9abb5e1d4e4ac6 (patch) | |
tree | 76e215a788cc9aaedbf00bbf67d670ac4ed861c0 /teal-src | |
parent | 3a071d87b8dd5d6d29b79a4166e3ef0fda83df1a (diff) | |
download | prosody-9f21d5487cb0291a156f9866bf9abb5e1d4e4ac6.tar.gz prosody-9f21d5487cb0291a156f9866bf9abb5e1d4e4ac6.zip |
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.
Diffstat (limited to 'teal-src')
-rw-r--r-- | teal-src/prosody/plugins/mod_cron.tl | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/teal-src/prosody/plugins/mod_cron.tl b/teal-src/prosody/plugins/mod_cron.tl index 357294d6..ab6310e7 100644 --- a/teal-src/prosody/plugins/mod_cron.tl +++ b/teal-src/prosody/plugins/mod_cron.tl @@ -42,6 +42,12 @@ function module.add_host(host_module : moduleapi) 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 @@ function module.add_host(host_module : moduleapi) 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 @@ local function should_run(when : frequency, last : integer) : boolean 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 @@ scheduled = module:add_timer(1, function() : integer 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); |