Software /
code /
prosody
Comparison
plugins/mod_smacks.lua @ 12136:6366240d2edb
mod_smacks: Limit "old" session resumption counters
Doing this when creating a whole new session seems reasonable because it
is already expensive and this is when it may be adding to the old
session store, while a successful resumption should be plus-minus zero.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Fri, 31 Dec 2021 00:48:38 +0100 |
parent | 12135:fa804c2db747 |
child | 12137:4e61aaa4e9b2 |
comparison
equal
deleted
inserted
replaced
12135:fa804c2db747 | 12136:6366240d2edb |
---|---|
50 local smqueue = require "util.smqueue"; | 50 local smqueue = require "util.smqueue"; |
51 local st = require "util.stanza"; | 51 local st = require "util.stanza"; |
52 local timer = require "util.timer"; | 52 local timer = require "util.timer"; |
53 local new_id = require "util.id".short; | 53 local new_id = require "util.id".short; |
54 local watchdog = require "util.watchdog"; | 54 local watchdog = require "util.watchdog"; |
55 local it = require"util.iterators"; | |
55 | 56 |
56 local sessionmanager = require "core.sessionmanager"; | 57 local sessionmanager = require "core.sessionmanager"; |
57 local core_process_stanza = prosody.core_process_stanza; | 58 local core_process_stanza = prosody.core_process_stanza; |
58 | 59 |
59 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas"; | 60 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas"; |
70 local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", true); | 71 local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", true); |
71 local s2s_resend = module:get_option_boolean("smacks_s2s_resend", false); | 72 local s2s_resend = module:get_option_boolean("smacks_s2s_resend", false); |
72 local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0); | 73 local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0); |
73 local max_inactive_unacked_stanzas = module:get_option_number("smacks_max_inactive_unacked_stanzas", 256); | 74 local max_inactive_unacked_stanzas = module:get_option_number("smacks_max_inactive_unacked_stanzas", 256); |
74 local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 30); | 75 local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 30); |
76 local max_old_sessions = module:get_option_number("smacks_max_old_sessions", 10); | |
75 | 77 |
76 local c2s_sessions = module:shared("/*/c2s/sessions"); | 78 local c2s_sessions = module:shared("/*/c2s/sessions"); |
77 local local_sessions = prosody.hosts[module.host].sessions; | 79 local local_sessions = prosody.hosts[module.host].sessions; |
78 | 80 |
79 local function format_h(h) if h then return string.format("%d", h) end end | 81 local function format_h(h) if h then return string.format("%d", h) end end |
80 | 82 |
83 local all_old_sessions = module:open_store("smacks_h"); | |
81 local old_session_registry = module:open_store("smacks_h", "map"); | 84 local old_session_registry = module:open_store("smacks_h", "map"); |
82 local session_registry = module:shared "/*/smacks/resumption-tokens"; -- > user@host/resumption-token --> resource | 85 local session_registry = module:shared "/*/smacks/resumption-tokens"; -- > user@host/resumption-token --> resource |
83 | 86 |
84 local ack_errors = require"util.error".init("mod_smacks", xmlns_sm3, { | 87 local ack_errors = require"util.error".init("mod_smacks", xmlns_sm3, { |
85 head = { condition = "undefined-condition"; text = "Client acknowledged more stanzas than sent by server" }; | 88 head = { condition = "undefined-condition"; text = "Client acknowledged more stanzas than sent by server" }; |
277 local ok, err, err_text = can_do_smacks(session); | 280 local ok, err, err_text = can_do_smacks(session); |
278 if not ok then | 281 if not ok then |
279 session.log("warn", "Failed to enable smacks: %s", err_text); -- TODO: XEP doesn't say we can send error text, should it? | 282 session.log("warn", "Failed to enable smacks: %s", err_text); -- TODO: XEP doesn't say we can send error text, should it? |
280 (session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):tag(err, { xmlns = xmlns_errors})); | 283 (session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):tag(err, { xmlns = xmlns_errors})); |
281 return true; | 284 return true; |
285 end | |
286 | |
287 if session.username then | |
288 local old_sessions, err = all_old_sessions:get(session.username); | |
289 module:log("debug", "Old sessions: %q", old_sessions) | |
290 if old_sessions then | |
291 local keep, count = {}, 0; | |
292 for token, info in it.sorted_pairs(old_sessions, function(a, b) | |
293 return (old_sessions[a].t or 0) > (old_sessions[b].t or 0); | |
294 end) do | |
295 count = count + 1; | |
296 if count > max_old_sessions then break end | |
297 keep[token] = info; | |
298 end | |
299 all_old_sessions:set(session.username, keep); | |
300 end | |
282 end | 301 end |
283 | 302 |
284 module:log("debug", "Enabling stream management"); | 303 module:log("debug", "Enabling stream management"); |
285 session.smacks = xmlns_sm; | 304 session.smacks = xmlns_sm; |
286 | 305 |