aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2023-09-24 13:41:54 +0200
committerKim Alvefur <zash@zash.se>2023-09-24 13:41:54 +0200
commit069bcf619b5ce62f79f249a43432fa2de2281d1d (patch)
tree46505dd2284c98f94ea2d4956849e27c41aa347a
parentadfd306e6ec56e709dc1eed522acb36c20c2b19e (diff)
downloadprosody-069bcf619b5ce62f79f249a43432fa2de2281d1d.tar.gz
prosody-069bcf619b5ce62f79f249a43432fa2de2281d1d.zip
mod_storage_internal: Fix fast trimming of archive with exactly one item
This method would previously never delete the first (and only) item since it works out which item should become the first item after the trim operation, which doesn't make sense when all should be removed. This also works as an optimization for when all the last item should be trimmed, thus items should be removed.
-rw-r--r--plugins/mod_storage_internal.lua7
1 files changed, 7 insertions, 0 deletions
diff --git a/plugins/mod_storage_internal.lua b/plugins/mod_storage_internal.lua
index 66200977..bde294b2 100644
--- a/plugins/mod_storage_internal.lua
+++ b/plugins/mod_storage_internal.lua
@@ -347,6 +347,13 @@ end
function archive:trim(username, to_when)
local list, err = datamanager.list_open(username, host, self.store);
if not list then return list,err;end
+
+ -- shortcut: check if the last item should be trimmed, if so, drop the whole archive
+ local last = list[#list].when or datetime.parse(list[#list].attr.stamp);
+ if last <= to_when then
+ return datamanager.list_store(username, host, self.store, nil);
+ end
+
-- luacheck: ignore 211/exact
local i, exact = binary_search(list, function(item)
local when = item.when or datetime.parse(item.attr.stamp);