Annotate

plugins/mod_smacks.lua @ 12525:8087f5357f53 0.12

mod_smacks: Fix bounce of stanzas directed to full JID on unclean disconnect Fixes #1758 Introduced in 1ea01660c79a In e62025f949f9 to and from was inverted since it changed from acting on a reply to acting on the original stanza (or a clone thereof) Unsure of the purpose of this check, you don't usually send stanzas to your own full JID. Perhaps guarding against routing loops? The check was present in the original commit of mod_smacks, prosody-modules rev 9a7671720dec
author Kim Alvefur <zash@zash.se>
date Fri, 27 May 2022 12:05:47 +0200
parent 12522:1671cb924002
child 12526:252ed01896dd
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- XEP-0198: Stream Management for Prosody IM
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2 --
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 -- Copyright (C) 2010-2015 Matthew Wild
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 -- Copyright (C) 2010 Waqas Hussain
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 -- Copyright (C) 2012-2021 Kim Alvefur
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6 -- Copyright (C) 2012 Thijs Alkemade
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 -- Copyright (C) 2014 Florian Zeitz
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 -- Copyright (C) 2016-2020 Thilo Molitor
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9 --
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 -- This project is MIT/X11 licensed. Please see the
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 -- COPYING file in the source package for more information.
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 --
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13
11981
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
14 local tonumber = tonumber;
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
15 local tostring = tostring;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 local os_time = os.time;
11981
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
17
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
18 -- These metrics together allow to calculate an instantaneous
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
19 -- "unacked stanzas" metric in the graphing frontend, without us having to
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
20 -- iterate over all the queues.
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
21 local tx_queued_stanzas = module:measure("tx_queued_stanzas", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
22 local tx_dropped_stanzas = module:metric(
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
23 "histogram",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
24 "tx_dropped_stanzas", "", "number of stanzas in a queue which got dropped",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
25 {},
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
26 {buckets = {0, 1, 2, 4, 8, 16, 32}}
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
27 ):with_labels();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
28 local tx_acked_stanzas = module:metric(
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
29 "histogram",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
30 "tx_acked_stanzas", "", "number of items acked per ack received",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
31 {},
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
32 {buckets = {0, 1, 2, 4, 8, 16, 32}}
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
33 ):with_labels();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
34
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
35 -- number of session resumptions attempts where the session had expired
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
36 local resumption_expired = module:measure("session_resumption_expired", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
37 local resumption_age = module:metric(
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
38 "histogram",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
39 "resumption_age", "seconds", "time the session had been hibernating at the time of a resumption",
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
40 {},
12272
fe0f5c47fda3 mod_smacks: Tweak resumption age buckets towards multiples of 60
Kim Alvefur <zash@zash.se>
parents: 12137
diff changeset
41 {buckets = { 0, 1, 2, 5, 10, 30, 60, 120, 300, 600 }}
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
42 ):with_labels();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
43 local sessions_expired = module:measure("sessions_expired", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
44 local sessions_started = module:measure("sessions_started", "counter");
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
45
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
46
11981
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
47 local datetime = require "util.datetime";
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
48 local add_filter = require "util.filters".add_filter;
11981
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
49 local jid = require "util.jid";
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
50 local smqueue = require "util.smqueue";
11981
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
51 local st = require "util.stanza";
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
52 local timer = require "util.timer";
12112
08a949e63541 mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12081
diff changeset
53 local new_id = require "util.id".short;
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
54 local watchdog = require "util.watchdog";
12136
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
55 local it = require"util.iterators";
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
56
11981
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
57 local sessionmanager = require "core.sessionmanager";
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
58 local core_process_stanza = prosody.core_process_stanza;
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
59
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
60 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas";
5d8264f464a2 mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents: 11980
diff changeset
61 local xmlns_delay = "urn:xmpp:delay";
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
62 local xmlns_mam2 = "urn:xmpp:mam:2";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
63 local xmlns_sm2 = "urn:xmpp:sm:2";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
64 local xmlns_sm3 = "urn:xmpp:sm:3";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
65
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
66 local sm2_attr = { xmlns = xmlns_sm2 };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
67 local sm3_attr = { xmlns = xmlns_sm3 };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
68
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
69 local queue_size = module:get_option_number("smacks_max_queue_size", 500);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
70 local resume_timeout = module:get_option_number("smacks_hibernation_time", 600);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
71 local s2s_smacks = module:get_option_boolean("smacks_enabled_s2s", true);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
72 local s2s_resend = module:get_option_boolean("smacks_s2s_resend", false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
73 local max_unacked_stanzas = module:get_option_number("smacks_max_unacked_stanzas", 0);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
74 local max_inactive_unacked_stanzas = module:get_option_number("smacks_max_inactive_unacked_stanzas", 256);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
75 local delayed_ack_timeout = module:get_option_number("smacks_max_ack_delay", 30);
12136
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
76 local max_old_sessions = module:get_option_number("smacks_max_old_sessions", 10);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
77
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
78 local c2s_sessions = module:shared("/*/c2s/sessions");
12063
d308f6901397 mod_smacks: Simplify access to local user sessions
Kim Alvefur <zash@zash.se>
parents: 12062
diff changeset
79 local local_sessions = prosody.hosts[module.host].sessions;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
80
11977
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
81 local function format_h(h) if h then return string.format("%d", h) end end
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
82
12136
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
83 local all_old_sessions = module:open_store("smacks_h");
12051
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12050
diff changeset
84 local old_session_registry = module:open_store("smacks_h", "map");
12053
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12052
diff changeset
85 local session_registry = module:shared "/*/smacks/resumption-tokens"; -- > user@host/resumption-token --> resource
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
86
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
87 local ack_errors = require"util.error".init("mod_smacks", xmlns_sm3, {
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
88 head = { condition = "undefined-condition"; text = "Client acknowledged more stanzas than sent by server" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
89 tail = { condition = "undefined-condition"; text = "Client acknowledged less stanzas than already acknowledged" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
90 pop = { condition = "internal-server-error"; text = "Something went wrong with Stream Management" };
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
91 overflow = { condition = "resource-constraint", text = "Too many unacked stanzas remaining, session can't be resumed" }
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
92 });
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
93
12076
ad1fe36eaae7 mod_smacks: Fix typo (thanks codespell)
Kim Alvefur <zash@zash.se>
parents: 12075
diff changeset
94 -- COMPAT note the use of compatibility wrapper in events (queue:table())
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
95
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
96 local function ack_delayed(session, stanza)
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
97 -- fire event only if configured to do so and our session is not already hibernated or destroyed
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
98 if delayed_ack_timeout > 0 and session.awaiting_ack
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
99 and not session.hibernating and not session.destroyed then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
100 session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d",
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
101 session.outgoing_stanza_queue and session.outgoing_stanza_queue:count_unacked() or 0);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
102 module:fire_event("smacks-ack-delayed", {origin = session, queue = session.outgoing_stanza_queue:table(), stanza = stanza});
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
103 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
104 session.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
105 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
106
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
107 local function can_do_smacks(session, advertise_only)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
108 if session.smacks then return false, "unexpected-request", "Stream management is already enabled"; end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
109
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
110 local session_type = session.type;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
111 if session.username then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
112 if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
113 return false, "unexpected-request", "Client must bind a resource before enabling stream management";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
114 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
115 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
116 elseif s2s_smacks and (session_type == "s2sin" or session_type == "s2sout") then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
117 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
118 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
119 return false, "service-unavailable", "Stream management is not available for this stream";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
120 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
121
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
122 module:hook("stream-features",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
123 function (event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
124 if can_do_smacks(event.origin, true) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
125 event.features:tag("sm", sm2_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
126 event.features:tag("sm", sm3_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
127 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
128 end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
129
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
130 module:hook("s2s-stream-features",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
131 function (event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
132 if can_do_smacks(event.origin, true) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
133 event.features:tag("sm", sm2_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
134 event.features:tag("sm", sm3_attr):tag("optional"):up():up();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
135 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
136 end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
137
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
138 local function should_ack(session, force)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
139 if not session then return end -- shouldn't be possible
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
140 if session.destroyed then return end -- gone
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
141 if not session.smacks then return end -- not using
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
142 if session.hibernating then return end -- can't ack when asleep
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
143 if session.awaiting_ack then return end -- already waiting
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
144 if force then return force end
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
145 local queue = session.outgoing_stanza_queue;
12522
1671cb924002 mod_smacks: Fix to use current method of counting acked stanzas
Kim Alvefur <zash@zash.se>
parents: 12272
diff changeset
146 local expected_h = queue:count_acked() + queue:count_unacked();
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
147 local max_unacked = max_unacked_stanzas;
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
148 if session.state == "inactive" then
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
149 max_unacked = max_inactive_unacked_stanzas;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
150 end
12078
2c13aaae35ac mod_smacks: Fix typos
Kim Alvefur <zash@zash.se>
parents: 12077
diff changeset
151 -- this check of last_requested_h prevents ack-loops if misbehaving clients report wrong
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
152 -- stanza counts. it is set when an <r> is really sent (e.g. inside timer), preventing any
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
153 -- further requests until a higher h-value would be expected.
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
154 return queue:count_unacked() > max_unacked and expected_h ~= session.last_requested_h;
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
155 end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
156
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
157 local function request_ack(session, reason)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
158 local queue = session.outgoing_stanza_queue;
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
159 session.log("debug", "Sending <r> (inside timer, before send) from %s - #queue=%d", reason, queue:count_unacked());
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
160 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks }))
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
161 if session.destroyed then return end -- sending something can trigger destruction
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
162 session.awaiting_ack = true;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
163 -- expected_h could be lower than this expression e.g. more stanzas added to the queue meanwhile)
12522
1671cb924002 mod_smacks: Fix to use current method of counting acked stanzas
Kim Alvefur <zash@zash.se>
parents: 12272
diff changeset
164 session.last_requested_h = queue:count_acked() + queue:count_unacked();
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
165 session.log("debug", "Sending <r> (inside timer, after send) from %s - #queue=%d", reason, queue:count_unacked());
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
166 if not session.delayed_ack_timer then
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
167 session.delayed_ack_timer = timer.add_task(delayed_ack_timeout, function()
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
168 ack_delayed(session, nil); -- we don't know if this is the only new stanza in the queue
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
169 end);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
170 end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
171 end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
172
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
173 local function request_ack_now_if_needed(session, force, reason)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
174 if should_ack(session, force) then
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
175 request_ack(session, reason);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
176 end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
177 end
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
178
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
179 local function outgoing_stanza_filter(stanza, session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
180 -- XXX: Normally you wouldn't have to check the xmlns for a stanza as it's
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
181 -- supposed to be nil.
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
182 -- However, when using mod_smacks with mod_websocket, then mod_websocket's
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
183 -- stanzas/out filter can get called before this one and adds the xmlns.
12045
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12044
diff changeset
184 if session.resending_unacked then return stanza end
12073
4cbe7979a92a mod_smacks: Fix traceback when bouncing unacked stanzas
Kim Alvefur <zash@zash.se>
parents: 12072
diff changeset
185 if not session.smacks then return stanza end
11979
705c4c07a860 mod_smacks: Use stanza type checking function for correctness
Kim Alvefur <zash@zash.se>
parents: 11978
diff changeset
186 local is_stanza = st.is_stanza(stanza) and
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
187 (not stanza.attr.xmlns or stanza.attr.xmlns == 'jabber:client')
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
188 and not stanza.name:find":";
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
189
12045
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12044
diff changeset
190 if is_stanza then
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
191 local queue = session.outgoing_stanza_queue;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
192 local cached_stanza = st.clone(stanza);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
193
11983
27f2539b4f87 mod_smacks: Remove dead conditional
Kim Alvefur <zash@zash.se>
parents: 11982
diff changeset
194 if cached_stanza.name ~= "iq" and cached_stanza:get_child("delay", xmlns_delay) == nil then
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
195 cached_stanza = cached_stanza:tag("delay", {
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
196 xmlns = xmlns_delay,
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
197 from = jid.bare(session.full_jid or session.host),
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
198 stamp = datetime.datetime()
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
199 });
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
200 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
201
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
202 queue:push(cached_stanza);
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
203 tx_queued_stanzas(1);
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
204
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
205 if session.hibernating then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
206 session.log("debug", "hibernating since %s, stanza queued", datetime.datetime(session.hibernating));
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
207 -- FIXME queue implementation changed, anything depending on it being an array will break
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
208 module:fire_event("smacks-hibernation-stanza-queued", {origin = session, queue = queue:table(), stanza = cached_stanza});
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
209 return nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
210 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
211 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
212 return stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
213 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
214
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
215 local function count_incoming_stanzas(stanza, session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
216 if not stanza.attr.xmlns then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
217 session.handled_stanza_count = session.handled_stanza_count + 1;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
218 session.log("debug", "Handled %d incoming stanzas", session.handled_stanza_count);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
219 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
220 return stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
221 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
222
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
223 local function wrap_session_out(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
224 if not resume then
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
225 session.outgoing_stanza_queue = smqueue.new(queue_size);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
226 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
227
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
228 add_filter(session, "stanzas/out", outgoing_stanza_filter, -999);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
229
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
230 return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
231 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
232
11975
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
233 module:hook("pre-session-close", function(event)
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
234 local session = event.session;
12075
9f4d88f54a54 mod_smacks: Avoid log noise when a non-smacks session is closed
Kim Alvefur <zash@zash.se>
parents: 12074
diff changeset
235 if session.smacks == nil then return end
11975
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
236 if session.resumption_token then
12069
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
237 session.log("debug", "Revoking resumption token");
12053
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12052
diff changeset
238 session_registry[jid.join(session.username, session.host, session.resumption_token)] = nil;
12051
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12050
diff changeset
239 old_session_registry:set(session.username, session.resumption_token, nil);
11975
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
240 session.resumption_token = nil;
12069
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
241 else
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
242 session.log("debug", "Session not resumable");
11975
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
243 end
12062
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12061
diff changeset
244 if session.hibernating_watchdog then
12069
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
245 session.log("debug", "Removing sleeping watchdog");
12062
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12061
diff changeset
246 -- If the session is being replaced instead of resume, we don't want the
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12061
diff changeset
247 -- old session around to time out and cause trouble for the new session
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12061
diff changeset
248 session.hibernating_watchdog:cancel();
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12061
diff changeset
249 session.hibernating_watchdog = nil;
12069
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
250 else
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
251 session.log("debug", "No watchdog set");
12062
4972244fe87b mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents: 12061
diff changeset
252 end
11975
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
253 -- send out last ack as per revision 1.5.2 of XEP-0198
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
254 if session.smacks and session.conn and session.handled_stanza_count then
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
255 (session.sends2s or session.send)(st.stanza("a", {
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
256 xmlns = session.smacks;
11977
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
257 h = format_h(session.handled_stanza_count);
11975
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
258 }));
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
259 end
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
260 end);
fcea4d9e7502 mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents: 11952
diff changeset
261
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
262 local function wrap_session_in(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
263 if not resume then
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
264 sessions_started(1);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
265 session.handled_stanza_count = 0;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
266 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
267 add_filter(session, "stanzas/in", count_incoming_stanzas, 999);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
268
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
269 return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
270 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
271
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
272 local function wrap_session(session, resume)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
273 wrap_session_out(session, resume);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
274 wrap_session_in(session, resume);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
275 return session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
276 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
277
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
278 function handle_enable(session, stanza, xmlns_sm)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
279 local ok, err, err_text = can_do_smacks(session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
280 if not ok then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
281 session.log("warn", "Failed to enable smacks: %s", err_text); -- TODO: XEP doesn't say we can send error text, should it?
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
282 (session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):tag(err, { xmlns = xmlns_errors}));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
283 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
284 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
285
12136
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
286 if session.username then
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
287 local old_sessions, err = all_old_sessions:get(session.username);
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
288 module:log("debug", "Old sessions: %q", old_sessions)
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
289 if old_sessions then
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
290 local keep, count = {}, 0;
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
291 for token, info in it.sorted_pairs(old_sessions, function(a, b)
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
292 return (old_sessions[a].t or 0) > (old_sessions[b].t or 0);
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
293 end) do
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
294 count = count + 1;
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
295 if count > max_old_sessions then break end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
296 keep[token] = info;
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
297 end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
298 all_old_sessions:set(session.username, keep);
12137
4e61aaa4e9b2 mod_smacks: Log error to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12136
diff changeset
299 elseif err then
4e61aaa4e9b2 mod_smacks: Log error to silence luacheck
Kim Alvefur <zash@zash.se>
parents: 12136
diff changeset
300 module:log("error", "Unable to retrieve old resumption counters: %s", err);
12136
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
301 end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
302 end
6366240d2edb mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents: 12135
diff changeset
303
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
304 module:log("debug", "Enabling stream management");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
305 session.smacks = xmlns_sm;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
306
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
307 wrap_session(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
308
12080
9744a0ceb767 mod_smacks: Only include max resumption time when resumption is activated
Kim Alvefur <zash@zash.se>
parents: 12078
diff changeset
309 local resume_max;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
310 local resume_token;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
311 local resume = stanza.attr.resume;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
312 if resume == "true" or resume == "1" then
12112
08a949e63541 mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12081
diff changeset
313 resume_token = new_id();
12053
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12052
diff changeset
314 session_registry[jid.join(session.username, session.host, resume_token)] = session;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
315 session.resumption_token = resume_token;
12080
9744a0ceb767 mod_smacks: Only include max resumption time when resumption is activated
Kim Alvefur <zash@zash.se>
parents: 12078
diff changeset
316 resume_max = tostring(resume_timeout);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
317 end
12080
9744a0ceb767 mod_smacks: Only include max resumption time when resumption is activated
Kim Alvefur <zash@zash.se>
parents: 12078
diff changeset
318 (session.sends2s or session.send)(st.stanza("enabled", { xmlns = xmlns_sm, id = resume_token, resume = resume, max = resume_max }));
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
319 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
320 end
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
321 module:hook_tag(xmlns_sm2, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm2); end, 100);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
322 module:hook_tag(xmlns_sm3, "enable", function (session, stanza) return handle_enable(session, stanza, xmlns_sm3); end, 100);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
323
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
324 module:hook_tag("http://etherx.jabber.org/streams", "features",
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
325 function (session, stanza)
11936
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
326 -- Needs to be done after flushing sendq since those aren't stored as
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
327 -- stanzas and counting them is weird.
12081
6cc3135138d7 mod_smacks: Add future todo
Kim Alvefur <zash@zash.se>
parents: 12080
diff changeset
328 -- TODO unify sendq and smqueue
11936
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
329 timer.add_task(1e-6, function ()
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
330 if can_do_smacks(session) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
331 if stanza:get_child("sm", xmlns_sm3) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
332 session.sends2s(st.stanza("enable", sm3_attr));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
333 session.smacks = xmlns_sm3;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
334 elseif stanza:get_child("sm", xmlns_sm2) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
335 session.sends2s(st.stanza("enable", sm2_attr));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
336 session.smacks = xmlns_sm2;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
337 else
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
338 return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
339 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
340 wrap_session_out(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
341 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
342 end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
343 end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
344
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
345 function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
346 module:log("debug", "Enabling stream management");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
347 session.smacks = xmlns_sm;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
348
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
349 wrap_session_in(session, false);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
350
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
351 -- FIXME Resume?
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
352
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
353 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
354 end
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
355 module:hook_tag(xmlns_sm2, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm2); end, 100);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
356 module:hook_tag(xmlns_sm3, "enabled", function (session, stanza) return handle_enabled(session, stanza, xmlns_sm3); end, 100);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
357
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
358 function handle_r(origin, stanza, xmlns_sm) -- luacheck: ignore 212/stanza
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
359 if not origin.smacks then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
360 module:log("debug", "Received ack request from non-smack-enabled session");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
361 return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
362 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
363 module:log("debug", "Received ack request, acking for %d", origin.handled_stanza_count);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
364 -- Reply with <a>
11977
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
365 (origin.sends2s or origin.send)(st.stanza("a", { xmlns = xmlns_sm, h = format_h(origin.handled_stanza_count) }));
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
366 -- piggyback our own ack request if needed (see request_ack_if_needed() for explanation of last_requested_h)
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
367 request_ack_now_if_needed(origin, false, "piggybacked by handle_r", nil);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
368 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
369 end
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
370 module:hook_tag(xmlns_sm2, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm2); end);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
371 module:hook_tag(xmlns_sm3, "r", function (origin, stanza) return handle_r(origin, stanza, xmlns_sm3); end);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
372
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
373 function handle_a(origin, stanza)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
374 if not origin.smacks then return; end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
375 origin.awaiting_ack = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
376 if origin.awaiting_ack_timer then
11936
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
377 timer.stop(origin.awaiting_ack_timer);
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
378 origin.awaiting_ack_timer = nil;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
379 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
380 if origin.delayed_ack_timer then
11936
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
381 timer.stop(origin.delayed_ack_timer)
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
382 origin.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
383 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
384 -- Remove handled stanzas from outgoing_stanza_queue
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
385 local h = tonumber(stanza.attr.h);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
386 if not h then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
387 origin:close{ condition = "invalid-xml"; text = "Missing or invalid 'h' attribute"; };
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
388 return;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
389 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
390 local queue = origin.outgoing_stanza_queue;
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
391 local handled_stanza_count = h-queue:count_acked();
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
392 local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
393 if err then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
394 origin.log("warn", "The client says it handled %d new stanzas, but we sent %d :)",
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
395 handled_stanza_count, queue:count_unacked());
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
396 origin.log("debug", "Client h: %d, our h: %d", tonumber(stanza.attr.h), queue:count_acked());
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
397 for i, item in queue._queue:items() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
398 origin.log("debug", "Q item %d: %s", i, item);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
399 end
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
400 origin:close(err);
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
401 return;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
402 end
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
403 tx_acked_stanzas:sample(handled_stanza_count);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
404
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
405 origin.log("debug", "#queue = %d (acked: %d)", queue:count_unacked(), handled_stanza_count);
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
406 request_ack_now_if_needed(origin, false, "handle_a", nil)
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
407 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
408 end
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
409 module:hook_tag(xmlns_sm2, "a", handle_a);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
410 module:hook_tag(xmlns_sm3, "a", handle_a);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
411
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
412 local function handle_unacked_stanzas(session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
413 local queue = session.outgoing_stanza_queue;
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
414 local unacked = queue:count_unacked()
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
415 if unacked > 0 then
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
416 tx_dropped_stanzas:sample(unacked);
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
417 session.smacks = false; -- Disable queueing
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
418 session.outgoing_stanza_queue = nil;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
419 for stanza in queue._queue:consume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
420 if not module:fire_event("delivery/failure", { session = session, stanza = stanza }) then
12525
8087f5357f53 mod_smacks: Fix bounce of stanzas directed to full JID on unclean disconnect
Kim Alvefur <zash@zash.se>
parents: 12522
diff changeset
421 if stanza.attr.type ~= "error" and stanza.attr.from ~= session.full_jid then
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
422 local reply = st.error_reply(stanza, "cancel", "recipient-unavailable");
11997
1ea01660c79a mod_smacks: Refactor, simplify, optimize
Kim Alvefur <zash@zash.se>
parents: 11996
diff changeset
423 core_process_stanza(session, reply);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
424 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
425 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
426 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
427 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
428 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
429
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
430 -- don't send delivery errors for messages which will be delivered by mam later on
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
431 -- check if stanza was archived --> this will allow us to send back errors for stanzas not archived
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
432 -- because the user configured the server to do so ("no-archive"-setting for one special contact for example)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
433 module:hook("delivery/failure", function(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
434 local session, stanza = event.session, event.stanza;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
435 -- Only deal with authenticated (c2s) sessions
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
436 if session.username then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
437 if stanza.name == "message" and stanza.attr.xmlns == nil and
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
438 ( stanza.attr.type == "chat" or ( stanza.attr.type or "normal" ) == "normal" ) then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
439 -- don't store messages in offline store if they are mam results
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
440 local mam_result = stanza:get_child("result", xmlns_mam2);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
441 if mam_result ~= nil then
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
442 return true; -- stanza already "handled", don't send an error and don't add it to offline storage
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
443 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
444 -- do nothing here for normal messages and don't send out "message delivery errors",
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
445 -- because messages are already in MAM at this point (no need to frighten users)
12114
e32f90c81519 mod_smacks: Compact code using new stanza API
Kim Alvefur <zash@zash.se>
parents: 12112
diff changeset
446 local stanza_id = stanza:get_child_with_attr("stanza-id", "urn:xmpp:sid:0", "by", jid.bare(session.full_jid));
e32f90c81519 mod_smacks: Compact code using new stanza API
Kim Alvefur <zash@zash.se>
parents: 12112
diff changeset
447 stanza_id = stanza_id and stanza_id.attr.id;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
448 if session.mam_requested and stanza_id ~= nil then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
449 session.log("debug", "mod_smacks delivery/failure returning true for mam-handled stanza: mam-archive-id=%s", tostring(stanza_id));
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
450 return true; -- stanza handled, don't send an error
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
451 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
452 -- store message in offline store, if this client does not use mam *and* was the last client online
12063
d308f6901397 mod_smacks: Simplify access to local user sessions
Kim Alvefur <zash@zash.se>
parents: 12062
diff changeset
453 local sessions = local_sessions[session.username] and local_sessions[session.username].sessions or nil;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
454 if sessions and next(sessions) == session.resource and next(sessions, session.resource) == nil then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
455 local ok = module:fire_event("message/offline/handle", { origin = session, username = session.username, stanza = stanza });
12048
f087bfd021ad mod_smacks: Fix typo
Kim Alvefur <zash@zash.se>
parents: 12047
diff changeset
456 session.log("debug", "mod_smacks delivery/failure returning %s for offline-handled stanza", tostring(ok));
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
457 return ok; -- if stanza was handled, don't send an error
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
458 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
459 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
460 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
461 end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
462
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
463 module:hook("pre-resource-unbind", function (event)
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
464 local session = event.session;
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
465 if not session.smacks then return end
12060
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12059
diff changeset
466 if not session.resumption_token then
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12059
diff changeset
467 local queue = session.outgoing_stanza_queue;
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
468 if queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
469 session.log("debug", "Destroying session with %d unacked stanzas", queue:count_unacked());
12060
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12059
diff changeset
470 handle_unacked_stanzas(session);
3099e03b10bd mod_smacks: Fix indentation
Kim Alvefur <zash@zash.se>
parents: 12059
diff changeset
471 end
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
472 return
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
473 end
12072
ef0f174488af mod_smacks: Fix duplicate sleep behavior when replacing a session
Kim Alvefur <zash@zash.se>
parents: 12070
diff changeset
474 if session.hibernating then return end
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
475
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
476 session.hibernating = os_time();
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
477 session.hibernating_watchdog = watchdog.new(resume_timeout, function()
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
478 session.log("debug", "mod_smacks hibernation timeout reached...");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
479 if session.destroyed then
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
480 session.log("debug", "The session has already been destroyed");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
481 return
12061
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
482 elseif not session.resumption_token then
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
483 -- This should normally not happen, the watchdog should be canceled from session:close()
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
484 session.log("debug", "The session has already been resumed or replaced");
31a7e0ac6928 mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents: 12060
diff changeset
485 return
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
486 end
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
487
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
488 session.log("debug", "Destroying session for hibernating too long");
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
489 session_registry[jid.join(session.username, session.host, session.resumption_token)] = nil;
12135
fa804c2db747 mod_smacks: Record timestamp with persisted counters
Kim Alvefur <zash@zash.se>
parents: 12125
diff changeset
490 old_session_registry:set(session.username, session.resumption_token,
fa804c2db747 mod_smacks: Record timestamp with persisted counters
Kim Alvefur <zash@zash.se>
parents: 12125
diff changeset
491 { h = session.handled_stanza_count; t = os.time() });
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
492 session.resumption_token = nil;
12059
70a55fbe447c mod_smacks: Stop stanzas from being queued on hibernation timeout
Kim Alvefur <zash@zash.se>
parents: 12056
diff changeset
493 session.resending_unacked = true; -- stop outgoing_stanza_filter from re-queueing anything anymore
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
494 sessionmanager.destroy_session(session, "Hibernating too long");
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
495 sessions_expired(1);
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
496 end);
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
497 if session.conn then
12070
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
498 local conn = session.conn;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
499 c2s_sessions[conn] = nil;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
500 session.conn = nil;
e662c172ea0f mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents: 12069
diff changeset
501 conn:close();
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
502 end
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
503 module:fire_event("smacks-hibernation-start", { origin = session; queue = session.outgoing_stanza_queue:table() });
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
504 return true; -- Postpone destruction for now
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
505 end);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
506
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
507 local function handle_s2s_destroyed(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
508 local session = event.session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
509 local queue = session.outgoing_stanza_queue;
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
510 if queue and queue:count_unacked() > 0 then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
511 session.log("warn", "Destroying session with %d unacked stanzas", queue:count_unacked());
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
512 if s2s_resend then
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
513 for stanza in queue:consume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
514 module:send(stanza);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
515 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
516 session.outgoing_stanza_queue = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
517 else
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
518 handle_unacked_stanzas(session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
519 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
520 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
521 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
522
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
523 module:hook("s2sout-destroyed", handle_s2s_destroyed);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
524 module:hook("s2sin-destroyed", handle_s2s_destroyed);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
525
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
526 local function get_session_id(session)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
527 return session.id or (tostring(session):match("[a-f0-9]+$"));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
528 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
529
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
530 function handle_resume(session, stanza, xmlns_sm)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
531 if session.full_jid then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
532 session.log("warn", "Tried to resume after resource binding");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
533 session.send(st.stanza("failed", { xmlns = xmlns_sm })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
534 :tag("unexpected-request", { xmlns = xmlns_errors })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
535 );
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
536 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
537 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
538
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
539 local id = stanza.attr.previd;
12053
03e9587fbfd2 mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents: 12052
diff changeset
540 local original_session = session_registry[jid.join(session.username, session.host, id)];
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
541 if not original_session then
12051
c32ef09ab452 mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents: 12050
diff changeset
542 local old_session = old_session_registry:get(session.username, id);
11978
628374809421 mod_smacks: Remove redundant fields
Kim Alvefur <zash@zash.se>
parents: 11977
diff changeset
543 if old_session then
12066
f07c8240a71d mod_smacks: Split log messages for when an old session exists in storage
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
544 session.log("debug", "Tried to resume old expired session with id %s", id);
11977
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
545 session.send(st.stanza("failed", { xmlns = xmlns_sm, h = format_h(old_session.h) })
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
546 :tag("item-not-found", { xmlns = xmlns_errors })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
547 );
12052
d17b8fcf11c7 mod_smacks: Clear resumption token from persistent storage on resumption
Kim Alvefur <zash@zash.se>
parents: 12051
diff changeset
548 old_session_registry:set(session.username, id, nil);
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
549 resumption_expired(1);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
550 else
12066
f07c8240a71d mod_smacks: Split log messages for when an old session exists in storage
Kim Alvefur <zash@zash.se>
parents: 12065
diff changeset
551 session.log("debug", "Tried to resume non-existent session with id %s", id);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
552 session.send(st.stanza("failed", { xmlns = xmlns_sm })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
553 :tag("item-not-found", { xmlns = xmlns_errors })
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
554 );
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
555 end;
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
556 else
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
557 if original_session.hibernating_watchdog then
12069
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
558 original_session.log("debug", "Letting the watchdog go");
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
559 original_session.hibernating_watchdog:cancel();
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
560 original_session.hibernating_watchdog = nil;
12074
b892f5489d79 mod_smacks: Check if session was really sleeping before logging message
Kim Alvefur <zash@zash.se>
parents: 12073
diff changeset
561 elseif session.hibernating then
12069
b9e08cbd032b mod_smacks: Add more logging
Kim Alvefur <zash@zash.se>
parents: 12068
diff changeset
562 original_session.log("error", "Hibernating session has no watchdog!")
12054
0116fa57f05c mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents: 12053
diff changeset
563 end
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
564 -- zero age = was not hibernating yet
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
565 local age = 0;
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
566 if original_session.hibernating then
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
567 local now = os_time();
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
568 age = now - original_session.hibernating;
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
569 end
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
570 session.log("debug", "mod_smacks resuming existing session %s...", get_session_id(original_session));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
571 original_session.log("debug", "mod_smacks session resumed from %s...", get_session_id(session));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
572 -- TODO: All this should move to sessionmanager (e.g. session:replace(new_session))
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
573 if original_session.conn then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
574 original_session.log("debug", "mod_smacks closing an old connection for this session");
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
575 local conn = original_session.conn;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
576 c2s_sessions[conn] = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
577 conn:close();
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
578 end
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
579
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
580 local migrated_session_log = session.log;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
581 original_session.ip = session.ip;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
582 original_session.conn = session.conn;
12044
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12043
diff changeset
583 original_session.rawsend = session.rawsend;
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12043
diff changeset
584 original_session.rawsend.session = original_session;
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12043
diff changeset
585 original_session.rawsend.conn = original_session.conn;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
586 original_session.send = session.send;
12044
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12043
diff changeset
587 original_session.send.session = original_session;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
588 original_session.close = session.close;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
589 original_session.filter = session.filter;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
590 original_session.filter.session = original_session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
591 original_session.filters = session.filters;
12044
9eb1a178293e mod_smacks: Patch various self-references on the resumed session
Kim Alvefur <zash@zash.se>
parents: 12043
diff changeset
592 original_session.send.filter = original_session.filter;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
593 original_session.stream = session.stream;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
594 original_session.secure = session.secure;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
595 original_session.hibernating = nil;
12046
372ec5cd0f51 mod_smacks: Increment a counter for each resumption
Kim Alvefur <zash@zash.se>
parents: 12045
diff changeset
596 original_session.resumption_counter = (original_session.resumption_counter or 0) + 1;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
597 session.log = original_session.log;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
598 session.type = original_session.type;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
599 wrap_session(original_session, true);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
600 -- Inform xmppstream of the new session (passed to its callbacks)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
601 original_session.stream:set_session(original_session);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
602 -- Similar for connlisteners
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
603 c2s_sessions[session.conn] = original_session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
604
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
605 local queue = original_session.outgoing_stanza_queue;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
606 local h = tonumber(stanza.attr.h);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
607
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
608 original_session.log("debug", "Pre-resumption #queue = %d", queue:count_unacked())
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
609 local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
610
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
611 if not err and not queue:resumable() then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
612 err = ack_errors.new("overflow");
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
613 end
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
614
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
615 if err or not queue:resumable() then
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
616 original_session.send(st.stanza("failed",
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
617 { xmlns = xmlns_sm; h = format_h(original_session.handled_stanza_count); previd = id }));
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
618 original_session:close(err);
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
619 return false;
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
620 end
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
621
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
622 original_session.send(st.stanza("resumed", { xmlns = xmlns_sm,
11977
9f7a6f7d13de mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents: 11976
diff changeset
623 h = format_h(original_session.handled_stanza_count), previd = id }));
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
624
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
625 -- Ok, we need to re-send any stanzas that the client didn't see
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
626 -- ...they are what is now left in the outgoing stanza queue
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
627 -- We have to use the send of "session" because we don't want to add our resent stanzas
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
628 -- to the outgoing queue again
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
629
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
630 session.log("debug", "resending all unacked stanzas that are still queued after resume, #queue = %d", queue:count_unacked());
12047
81858fd6f198 mod_smacks: Flag both sessions to prevent duplicating queue on resumption
Kim Alvefur <zash@zash.se>
parents: 12046
diff changeset
631 -- FIXME Which session is it that the queue filter sees?
12045
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12044
diff changeset
632 session.resending_unacked = true;
12047
81858fd6f198 mod_smacks: Flag both sessions to prevent duplicating queue on resumption
Kim Alvefur <zash@zash.se>
parents: 12046
diff changeset
633 original_session.resending_unacked = true;
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
634 for _, queued_stanza in queue:resume() do
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
635 session.send(queued_stanza);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
636 end
12045
a6c821720cb6 mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents: 12044
diff changeset
637 session.resending_unacked = nil;
12047
81858fd6f198 mod_smacks: Flag both sessions to prevent duplicating queue on resumption
Kim Alvefur <zash@zash.se>
parents: 12046
diff changeset
638 original_session.resending_unacked = nil;
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
639 session.log("debug", "all stanzas resent, now disabling send() in this migrated session, #queue = %d", queue:count_unacked());
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
640 function session.send(stanza) -- luacheck: ignore 432
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
641 migrated_session_log("error", "Tried to send stanza on old session migrated by smacks resume (maybe there is a bug?): %s", tostring(stanza));
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
642 return false;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
643 end
12056
e62025f949f9 mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents: 12054
diff changeset
644 module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue:table()});
12067
97c377de8083 mod_smacks: Fix to not wait for acks from before a resumption
Kim Alvefur <zash@zash.se>
parents: 12066
diff changeset
645 original_session.awaiting_ack = nil; -- Don't wait for acks from before the resumption
12068
c3790ffdf467 mod_smacks: Remove useless delay in requesting ack on resumption
Kim Alvefur <zash@zash.se>
parents: 12067
diff changeset
646 request_ack_now_if_needed(original_session, true, "handle_resume", nil);
12125
649268c9f603 mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents: 12114
diff changeset
647 resumption_age:sample(age);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
648 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
649 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
650 end
11935
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
651 module:hook_tag(xmlns_sm2, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm2); end);
4d0d10fabb82 mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents: 11934
diff changeset
652 module:hook_tag(xmlns_sm3, "resume", function (session, stanza) return handle_resume(session, stanza, xmlns_sm3); end);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
653
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
654 -- Events when it's sensible to request an ack
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
655 -- Could experiment with forcing (ignoring max_unacked) <r>, but when and why?
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
656 local request_ack_events = {
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
657 ["csi-client-active"] = true;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
658 ["csi-flushing"] = false;
11938
6da703cb4c04 mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents: 11937
diff changeset
659 ["c2s-pre-ondrain"] = false;
6da703cb4c04 mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents: 11937
diff changeset
660 ["s2s-pre-ondrain"] = false;
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
661 };
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
662
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
663 for event_name, force in pairs(request_ack_events) do
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
664 module:hook(event_name, function(event)
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
665 local session = event.session or event.origin;
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
666 request_ack_now_if_needed(session, force, event_name);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
667 end);
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
668 end
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
669
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
670 local function handle_read_timeout(event)
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
671 local session = event.session;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
672 if session.smacks then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
673 if session.awaiting_ack then
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
674 if session.awaiting_ack_timer then
11936
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
675 timer.stop(session.awaiting_ack_timer);
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
676 session.awaiting_ack_timer = nil;
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
677 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
678 if session.delayed_ack_timer then
11936
3f49c35607ca mod_smacks: Fix timer lifetimes to follow session instead of module
Kim Alvefur <zash@zash.se>
parents: 11935
diff changeset
679 timer.stop(session.delayed_ack_timer);
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
680 session.delayed_ack_timer = nil;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
681 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
682 return false; -- Kick the session
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
683 end
11937
364c3f018e3a mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents: 11936
diff changeset
684 request_ack_now_if_needed(session, true, "read timeout");
11934
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
685 return true;
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
686 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
687 end
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
688
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
689 module:hook("s2s-read-timeout", handle_read_timeout);
65cdb1b21db3 mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff changeset
690 module:hook("c2s-read-timeout", handle_read_timeout);
12064
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
691
12065
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
692 module:hook_global("server-stopping", function(event)
12077
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12076
diff changeset
693 if not local_sessions then
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12076
diff changeset
694 -- not a VirtualHost, no user sessions
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12076
diff changeset
695 return
061d516d8ac5 mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents: 12076
diff changeset
696 end
12065
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
697 local reason = event.reason;
12078
2c13aaae35ac mod_smacks: Fix typos
Kim Alvefur <zash@zash.se>
parents: 12077
diff changeset
698 -- Close smacks-enabled sessions ourselves instead of letting mod_c2s close
12064
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
699 -- it, which invalidates the smacks session. This allows preserving the
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
700 -- counter value, so it can be communicated to the client when it tries to
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
701 -- resume the lost session after a restart.
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
702 for _, user in pairs(local_sessions) do
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
703 for _, session in pairs(user.sessions) do
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
704 if session.resumption_token then
12135
fa804c2db747 mod_smacks: Record timestamp with persisted counters
Kim Alvefur <zash@zash.se>
parents: 12125
diff changeset
705 if old_session_registry:set(session.username, session.resumption_token,
fa804c2db747 mod_smacks: Record timestamp with persisted counters
Kim Alvefur <zash@zash.se>
parents: 12125
diff changeset
706 { h = session.handled_stanza_count; t = os.time() }) then
12064
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
707 session.resumption_token = nil;
12065
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
708
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
709 -- Deal with unacked stanzas
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
710 if session.outgoing_stanza_queue then
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
711 handle_unacked_stanzas(session);
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
712 end
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
713
12064
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
714 if session.conn then
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
715 session.conn:close()
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
716 session.conn = nil;
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
717 -- Now when mod_c2s gets here, it will immediately destroy the
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
718 -- session since it is unconnected.
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
719 end
12065
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
720
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
721 -- And make sure nobody tries to send anything
9102cbd2aec4 mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents: 12064
diff changeset
722 session:close{ condition = "system-shutdown", text = reason };
12064
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
723 end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
724 end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
725 end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
726 end
d2380fd5e421 mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents: 12063
diff changeset
727 end, -90);