Software /
code /
prosody-modules
Comparison
mod_mam/mod_mam.lua @ 2764:1872a9129c2f
mod_mam: Use a FIFO queue for scheduling archive expiry
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Tue, 12 Sep 2017 15:46:49 +0200 |
parent | 2762:f2096c03428b |
child | 2768:2af42a3af131 |
comparison
equal
deleted
inserted
replaced
2763:a6d19aea9b73 | 2764:1872a9129c2f |
---|---|
57 end | 57 end |
58 | 58 |
59 local use_total = true; | 59 local use_total = true; |
60 | 60 |
61 local cleanup; | 61 local cleanup; |
62 | |
63 local function schedule_cleanup(username) | |
64 if cleanup and not cleanup[username] then | |
65 table.insert(cleanup, username); | |
66 cleanup[username] = true; | |
67 end | |
68 end | |
62 | 69 |
63 -- Handle prefs. | 70 -- Handle prefs. |
64 local function handle_prefs(event) | 71 local function handle_prefs(event) |
65 local origin, stanza = event.origin, event.stanza; | 72 local origin, stanza = event.origin, event.stanza; |
66 local xmlns_mam = stanza.tags[1].attr.xmlns; | 73 local xmlns_mam = stanza.tags[1].attr.xmlns; |
111 local origin, stanza = event.origin, event.stanza; | 118 local origin, stanza = event.origin, event.stanza; |
112 local xmlns_mam = stanza.tags[1].attr.xmlns; | 119 local xmlns_mam = stanza.tags[1].attr.xmlns; |
113 local query = stanza.tags[1]; | 120 local query = stanza.tags[1]; |
114 local qid = query.attr.queryid; | 121 local qid = query.attr.queryid; |
115 | 122 |
116 if cleanup then cleanup[origin.username] = true; end | 123 schedule_cleanup(origin.username); |
117 | 124 |
118 -- Search query parameters | 125 -- Search query parameters |
119 local qwith, qstart, qend; | 126 local qwith, qstart, qend; |
120 local form = query:get_child("x", "jabber:x:data"); | 127 local form = query:get_child("x", "jabber:x:data"); |
121 if form then | 128 if form then |
314 if ok then | 321 if ok then |
315 local clone_for_other_handlers = st.clone(stanza); | 322 local clone_for_other_handlers = st.clone(stanza); |
316 local id = ok; | 323 local id = ok; |
317 clone_for_other_handlers:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); | 324 clone_for_other_handlers:tag("stanza-id", { xmlns = xmlns_st_id, by = store_user.."@"..host, id = id }):up(); |
318 event.stanza = clone_for_other_handlers; | 325 event.stanza = clone_for_other_handlers; |
319 if cleanup then cleanup[store_user] = true; end | 326 schedule_cleanup(store_user); |
320 module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id }); | 327 module:fire_event("archive-message-added", { origin = origin, stanza = stanza, for_user = store_user, id = id }); |
321 end | 328 end |
322 else | 329 else |
323 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); | 330 log("debug", "Not archiving stanza: %s (prefs)", stanza:top_tag()); |
324 end | 331 end |
368 -- Iterating over users is not supported by all authentication modules | 375 -- Iterating over users is not supported by all authentication modules |
369 -- Catch and ignore error if not supported | 376 -- Catch and ignore error if not supported |
370 pcall(function () | 377 pcall(function () |
371 -- If this works, then we schedule cleanup for all known users on startup | 378 -- If this works, then we schedule cleanup for all known users on startup |
372 for user in um.users(module.host) do | 379 for user in um.users(module.host) do |
373 cleanup[user] = true; | 380 schedule_cleanup(user); |
374 end | 381 end |
375 end); | 382 end); |
376 | 383 |
377 -- At odd intervals, delete old messages for one user | 384 -- At odd intervals, delete old messages for one user |
378 module:add_timer(math.random(10, 60), function() | 385 module:add_timer(math.random(10, 60), function() |
379 local user = next(cleanup); | 386 local user = table.remove(cleanup, 1); |
380 if user then | 387 if user then |
381 module:log("debug", "Removing old messages for user %q", user); | 388 module:log("debug", "Removing old messages for user %q", user); |
382 local ok, err = archive:delete(user, { ["end"] = os.time() - cleanup_after; }) | 389 local ok, err = archive:delete(user, { ["end"] = os.time() - cleanup_after; }) |
383 if not ok then | 390 if not ok then |
384 module:log("warn", "Could not expire archives for user %s: %s", user, err); | 391 module:log("warn", "Could not expire archives for user %s: %s", user, err); |