aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2023-10-14 22:32:33 +0200
committerKim Alvefur <zash@zash.se>2023-10-14 22:32:33 +0200
commit9f21d5487cb0291a156f9866bf9abb5e1d4e4ac6 (patch)
tree76e215a788cc9aaedbf00bbf67d670ac4ed861c0
parent3a071d87b8dd5d6d29b79a4166e3ef0fda83df1a (diff)
downloadprosody-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.
-rw-r--r--plugins/mod_cron.lua38
-rw-r--r--teal-src/prosody/plugins/mod_cron.tl20
2 files changed, 41 insertions, 17 deletions
diff --git a/plugins/mod_cron.lua b/plugins/mod_cron.lua
index a39d05d5..dc9cfbd4 100644
--- a/plugins/mod_cron.lua
+++ b/plugins/mod_cron.lua
@@ -12,16 +12,27 @@ function module.add_host(host_module)
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 @@ function module.add_host(host_module)
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 @@ scheduled = module:add_timer(1, function()
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 --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);