mod_mam,mod_muc_mam: Allow other work to be performed during archive cleanup (fixes #1504)

This lets Prosody handle socket related work between each step in the
cleanup in order to prevent the server from being completely blocked
during this.

An async storage backend would not need this but those are currently
rare.
This commit is contained in:
Kim Alvefur 2020-03-11 21:15:01 +01:00
parent e59b70638c
commit e3911ce5da
2 changed files with 10 additions and 2 deletions

View file

@ -362,7 +362,8 @@ if cleanup_after ~= "never" then
end
end
cleanup_runner = require "util.async".runner(function ()
local async = require "util.async";
cleanup_runner = async.runner(function ()
local users = {};
local cut_off = datestamp(os.time() - cleanup_after);
for date in cleanup_storage:users() do
@ -391,6 +392,9 @@ if cleanup_after ~= "never" then
cleanup_map:set(cut_off, user, true);
module:log("error", "Could not delete messages for user '%s': %s", user, err);
end
local wait, done = async.waiter();
module:add_timer(0.01, done);
wait();
end
module:log("info", "Deleted %d expired messages for %d users", sum, num_users);
end);

View file

@ -437,7 +437,8 @@ if cleanup_after ~= "never" then
end
end
cleanup_runner = require "util.async".runner(function ()
local async = require "util.async";
cleanup_runner = async.runner(function ()
local rooms = {};
local cut_off = datestamp(os.time() - cleanup_after);
for date in cleanup_storage:users() do
@ -466,6 +467,9 @@ if cleanup_after ~= "never" then
cleanup_map:set(cut_off, room, true);
module:log("error", "Could not delete messages for room '%s': %s", room, err);
end
local wait, done = async.waiter();
module:add_timer(0.01, done);
wait();
end
module:log("info", "Deleted %d expired messages for %d rooms", sum, num_rooms);
end);