diff options
author | Kim Alvefur <zash@zash.se> | 2021-11-30 01:22:14 +0100 |
---|---|---|
committer | Kim Alvefur <zash@zash.se> | 2021-11-30 01:22:14 +0100 |
commit | 59258d47bd246ad55de5accf4331f44933a9755d (patch) | |
tree | 07a1d79d2245c2a5a40b2cf080496ad77f0389d2 | |
parent | 0a50cf1be43fc088c5a115d3f32bc4f9b8c0b2e8 (diff) | |
download | prosody-59258d47bd246ad55de5accf4331f44933a9755d.tar.gz prosody-59258d47bd246ad55de5accf4331f44933a9755d.zip |
mod_mam,mod_muc_mam: Simplify deletion when multi-user-deletion is supported
More code, but less of it needs to run and no extra tracking is needed.
-rw-r--r-- | plugins/mod_mam/mod_mam.lua | 35 | ||||
-rw-r--r-- | plugins/mod_muc_mam.lua | 32 |
2 files changed, 54 insertions, 13 deletions
diff --git a/plugins/mod_mam/mod_mam.lua b/plugins/mod_mam/mod_mam.lua index facf5bc0..e418d60d 100644 --- a/plugins/mod_mam/mod_mam.lua +++ b/plugins/mod_mam/mod_mam.lua @@ -509,20 +509,41 @@ if cleanup_after ~= "never" then -- messages, we collect the union of sets of users from dates that fall -- outside the cleanup range. - local last_date = require "util.cache".new(module:get_option_number("archive_cleanup_date_cache_size", 1000)); - function schedule_cleanup(username, date) - date = date or datestamp(); - if last_date:get(username) == date then return end - local ok = cleanup_map:set(date, username, true); - if ok then - last_date:set(username, date); + if not (archive.caps and archive.caps.wildcard_delete) then + local last_date = require "util.cache".new(module:get_option_number("archive_cleanup_date_cache_size", 1000)); + function schedule_cleanup(username, date) + date = date or datestamp(); + if last_date:get(username) == date then return end + local ok = cleanup_map:set(date, username, true); + if ok then + last_date:set(username, date); + end end end + local cleanup_time = module:measure("cleanup", "times"); local async = require "util.async"; cleanup_runner = async.runner(function () local cleanup_done = cleanup_time(); + + if archive.caps and archive.caps.wildcard_delete then + local ok, err = archive:delete(true, { ["end"] = os.time() - cleanup_after }) + if ok then + local sum = tonumber(ok); + if sum then + module:log("info", "Deleted %d expired messages", sum); + else + -- driver did not tell + module:log("info", "Deleted all expired messages"); + end + else + module:log("error", "Could not delete messages: %s", err); + end + cleanup_done(); + return; + end + local users = {}; local cut_off = datestamp(os.time() - cleanup_after); for date in cleanup_storage:users() do diff --git a/plugins/mod_muc_mam.lua b/plugins/mod_muc_mam.lua index 1edcec22..974aa6dc 100644 --- a/plugins/mod_muc_mam.lua +++ b/plugins/mod_muc_mam.lua @@ -480,12 +480,14 @@ if cleanup_after ~= "never" then -- outside the cleanup range. local last_date = require "util.cache".new(module:get_option_number("muc_log_cleanup_date_cache_size", 1000)); - function schedule_cleanup(roomname, date) - date = date or datestamp(); - if last_date:get(roomname) == date then return end - local ok = cleanup_map:set(date, roomname, true); - if ok then - last_date:set(roomname, date); + if not ( archive.caps and archive.caps.wildcard_delete ) then + function schedule_cleanup(roomname, date) + date = date or datestamp(); + if last_date:get(roomname) == date then return end + local ok = cleanup_map:set(date, roomname, true); + if ok then + last_date:set(roomname, date); + end end end @@ -494,6 +496,24 @@ if cleanup_after ~= "never" then local async = require "util.async"; cleanup_runner = async.runner(function () local cleanup_done = cleanup_time(); + + if archive.caps and archive.caps.wildcard_delete then + local ok, err = archive:delete(true, { ["end"] = os.time() - cleanup_after }) + if ok then + local sum = tonumber(ok); + if sum then + module:log("info", "Deleted %d expired messages", sum); + else + -- driver did not tell + module:log("info", "Deleted all expired messages"); + end + else + module:log("error", "Could not delete messages: %s", err); + end + cleanup_done(); + return; + end + local rooms = {}; local cut_off = datestamp(os.time() - cleanup_after); for date in cleanup_storage:users() do |