Software /
code /
prosody
Annotate
plugins/mod_smacks.lua @ 12763:d26eefe98d09
util.dbuffer: Add efficient shortcuts for discard() in certain cases
If the buffer is already empty, nothing to do. If we're throwing away the
whole buffer, we can just empty it and avoid read_chunk() (which in turn
may collapse()). These shortcuts are much more efficient.
author | Matthew Wild <mwild1@gmail.com> |
---|---|
date | Tue, 11 Oct 2022 11:37:55 +0100 |
parent | 12745:2cbf0e9314ff |
child | 12800:06ba2f8cee47 |
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 |
12471
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
5 -- Copyright (C) 2012-2022 Kim Alvefur |
11934
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 -- |
12471
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
13 -- TODO unify sendq and smqueue |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
14 |
11981
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
15 local tonumber = tonumber; |
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
16 local tostring = tostring; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
17 local os_time = os.time; |
11981
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
18 |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
19 -- 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
|
20 -- "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
|
21 -- iterate over all the queues. |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
22 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
|
23 local tx_dropped_stanzas = module:metric( |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
24 "histogram", |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
25 "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
|
26 {}, |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
27 {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
|
28 ):with_labels(); |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
29 local tx_acked_stanzas = module:metric( |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
30 "histogram", |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
31 "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
|
32 {}, |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
33 {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
|
34 ):with_labels(); |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
35 |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
36 -- 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
|
37 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
|
38 local resumption_age = module:metric( |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
39 "histogram", |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
40 "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
|
41 {}, |
12272
fe0f5c47fda3
mod_smacks: Tweak resumption age buckets towards multiples of 60
Kim Alvefur <zash@zash.se>
parents:
12137
diff
changeset
|
42 {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
|
43 ):with_labels(); |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
44 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
|
45 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
|
46 |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
47 |
11981
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
48 local datetime = require "util.datetime"; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
49 local add_filter = require "util.filters".add_filter; |
11981
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
50 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
|
51 local smqueue = require "util.smqueue"; |
11981
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
52 local st = require "util.stanza"; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
53 local timer = require "util.timer"; |
12112
08a949e63541
mod_smacks: Use more compact resumption tokens
Kim Alvefur <zash@zash.se>
parents:
12081
diff
changeset
|
54 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
|
55 local watchdog = require "util.watchdog"; |
12136
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
56 local it = require"util.iterators"; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
57 |
11981
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
58 local sessionmanager = require "core.sessionmanager"; |
5d8264f464a2
mod_smacks: Reorder imports etc
Kim Alvefur <zash@zash.se>
parents:
11980
diff
changeset
|
59 |
12739
0dc80024fdd2
Backed out changeset 1bc2220cd6ec
Jonas Schäfer <jonas@wielicki.name>
parents:
12720
diff
changeset
|
60 local xmlns_errors = "urn:ietf:params:xml:ns:xmpp-stanzas"; |
11981
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 |
12518
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
87 local function track_session(session, id) |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
88 session_registry[jid.join(session.username, session.host, id or session.resumption_token)] = session; |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
89 session.resumption_token = id; |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
90 end |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
91 |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
92 local function save_old_session(session) |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
93 session_registry[jid.join(session.username, session.host, session.resumption_token)] = nil; |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
94 return old_session_registry:set(session.username, session.resumption_token, |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
95 { h = session.handled_stanza_count; t = os.time() }) |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
96 end |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
97 |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
98 local function clear_old_session(session, id) |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
99 session_registry[jid.join(session.username, session.host, id or session.resumption_token)] = nil; |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
100 return old_session_registry:set(session.username, id or session.resumption_token, nil) |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
101 end |
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
102 |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
103 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
|
104 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
|
105 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
|
106 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
|
107 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
|
108 }); |
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
109 |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
110 local enable_errors = require "util.error".init("mod_smacks", xmlns_sm3, { |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
111 already_enabled = { condition = "unexpected-request", text = "Stream management is already enabled" }; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
112 bind_required = { condition = "unexpected-request", text = "Client must bind a resource before enabling stream management" }; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
113 unavailable = { condition = "service-unavailable", text = "Stream management is not available for this stream" }; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
114 -- Resumption |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
115 expired = { condition = "item-not-found", text = "Session expired, and cannot be resumed" }; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
116 already_bound = { condition = "unexpected-request", text = "Cannot resume another session after a resource is bound" }; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
117 unknown_session = { condition = "item-not-found", text = "Unknown session" }; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
118 }); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
119 |
12076
ad1fe36eaae7
mod_smacks: Fix typo (thanks codespell)
Kim Alvefur <zash@zash.se>
parents:
12075
diff
changeset
|
120 -- 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
|
121 |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
122 local function ack_delayed(session, stanza) |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
123 -- 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
|
124 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
|
125 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
|
126 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
|
127 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
|
128 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
|
129 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
130 session.delayed_ack_timer = nil; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
131 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
132 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
133 local function can_do_smacks(session, advertise_only) |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
134 if session.smacks then return false, enable_errors.new("already_enabled"); end |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
135 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
136 local session_type = session.type; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
137 if session.username then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
138 if not(advertise_only) and not(session.resource) then -- Fail unless we're only advertising sm |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
139 return false, enable_errors.new("bind_required"); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
140 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
141 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
142 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
|
143 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
144 end |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
145 return false, enable_errors.new("unavailable"); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
146 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
147 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
148 module:hook("stream-features", |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
149 function (event) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
150 if can_do_smacks(event.origin, true) then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
151 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
|
152 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
|
153 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
154 end); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
155 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
156 module:hook("s2s-stream-features", |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
157 function (event) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
158 if can_do_smacks(event.origin, true) then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
159 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
|
160 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
|
161 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
162 end); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
163 |
11937
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
164 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
|
165 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
|
166 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
|
167 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
|
168 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
|
169 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
|
170 if force then return force end |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
171 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
|
172 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
|
173 local max_unacked = max_unacked_stanzas; |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
174 if session.state == "inactive" then |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
175 max_unacked = max_inactive_unacked_stanzas; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
176 end |
12078 | 177 -- 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
|
178 -- 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
|
179 -- 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
|
180 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
|
181 end |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
182 |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
183 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
|
184 local queue = session.outgoing_stanza_queue; |
12524
dd5ab9a6b599
mod_smacks: Remove debug log references to timer (not used anymore)
Kim Alvefur <zash@zash.se>
parents:
12523
diff
changeset
|
185 session.log("debug", "Sending <r> from %s - #queue=%d", reason, queue:count_unacked()); |
12549
3729a6bdb562
mod_smacks: Fix #1761 by setting a flag earlier
Kim Alvefur <zash@zash.se>
parents:
12526
diff
changeset
|
186 session.awaiting_ack = true; |
11937
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
187 (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
|
188 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
|
189 -- 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
|
190 session.last_requested_h = queue:count_acked() + queue:count_unacked(); |
11937
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
191 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
|
192 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
|
193 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
|
194 end); |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
195 end |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
196 end |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
197 |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
198 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
|
199 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
|
200 request_ack(session, reason); |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
201 end |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
202 end |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
203 |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
204 local function outgoing_stanza_filter(stanza, session) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
205 -- 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
|
206 -- supposed to be nil. |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
207 -- 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
|
208 -- stanzas/out filter can get called before this one and adds the xmlns. |
12073
4cbe7979a92a
mod_smacks: Fix traceback when bouncing unacked stanzas
Kim Alvefur <zash@zash.se>
parents:
12072
diff
changeset
|
209 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
|
210 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
|
211 (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
|
212 and not stanza.name:find":"; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
213 |
12045
a6c821720cb6
mod_smacks: Back out 48f8fa6cea7b - back in a86ae74da96c again
Kim Alvefur <zash@zash.se>
parents:
12044
diff
changeset
|
214 if is_stanza then |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
215 local queue = session.outgoing_stanza_queue; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
216 local cached_stanza = st.clone(stanza); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
217 |
11983
27f2539b4f87
mod_smacks: Remove dead conditional
Kim Alvefur <zash@zash.se>
parents:
11982
diff
changeset
|
218 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
|
219 cached_stanza = cached_stanza:tag("delay", { |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
220 xmlns = xmlns_delay, |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
221 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
|
222 stamp = datetime.datetime() |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
223 }); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
224 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
225 |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
226 queue:push(cached_stanza); |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
227 tx_queued_stanzas(1); |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
228 |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
229 if session.hibernating then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
230 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
|
231 -- 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
|
232 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
|
233 return nil; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
234 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
235 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
236 return stanza; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
237 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
238 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
239 local function count_incoming_stanzas(stanza, session) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
240 if not stanza.attr.xmlns then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
241 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
|
242 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
|
243 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
244 return stanza; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
245 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
246 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
247 local function wrap_session_out(session, resume) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
248 if not resume then |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
249 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
|
250 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
251 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
252 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
|
253 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
254 return session; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
255 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
256 |
11975
fcea4d9e7502
mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents:
11952
diff
changeset
|
257 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
|
258 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
|
259 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
|
260 if session.resumption_token then |
12069 | 261 session.log("debug", "Revoking resumption token"); |
12518
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
262 clear_old_session(session); |
11975
fcea4d9e7502
mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents:
11952
diff
changeset
|
263 session.resumption_token = nil; |
12069 | 264 else |
265 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
|
266 end |
12062
4972244fe87b
mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents:
12061
diff
changeset
|
267 if session.hibernating_watchdog then |
12069 | 268 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
|
269 -- 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
|
270 -- 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
|
271 session.hibernating_watchdog:cancel(); |
4972244fe87b
mod_smacks: Cancel hibernation when session is closed
Kim Alvefur <zash@zash.se>
parents:
12061
diff
changeset
|
272 session.hibernating_watchdog = nil; |
12069 | 273 else |
274 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
|
275 end |
11975
fcea4d9e7502
mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents:
11952
diff
changeset
|
276 -- 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
|
277 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
|
278 (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
|
279 xmlns = session.smacks; |
11977
9f7a6f7d13de
mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents:
11976
diff
changeset
|
280 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
|
281 })); |
fcea4d9e7502
mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents:
11952
diff
changeset
|
282 end |
fcea4d9e7502
mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents:
11952
diff
changeset
|
283 end); |
fcea4d9e7502
mod_smacks: Use new pre-session-close event instead of monkeypatch
Kim Alvefur <zash@zash.se>
parents:
11952
diff
changeset
|
284 |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
285 local function wrap_session_in(session, resume) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
286 if not resume then |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
287 sessions_started(1); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
288 session.handled_stanza_count = 0; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
289 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
290 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
|
291 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
292 return session; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
293 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
294 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
295 local function wrap_session(session, resume) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
296 wrap_session_out(session, resume); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
297 wrap_session_in(session, resume); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
298 return session; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
299 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
300 |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
301 function do_enable(session, stanza) |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
302 local ok, err = can_do_smacks(session); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
303 if not ok then |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
304 session.log("warn", "Failed to enable smacks: %s", err.text); -- TODO: XEP doesn't say we can send error text, should it? |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
305 return nil, err; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
306 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
307 |
12136
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
308 if session.username then |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
309 local old_sessions, err = all_old_sessions:get(session.username); |
12519
d935af51c644
mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents:
12518
diff
changeset
|
310 session.log("debug", "Old sessions: %q", old_sessions) |
12136
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
311 if old_sessions then |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
312 local keep, count = {}, 0; |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
313 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
|
314 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
|
315 end) do |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
316 count = count + 1; |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
317 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
|
318 keep[token] = info; |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
319 end |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
320 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
|
321 elseif err then |
12519
d935af51c644
mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents:
12518
diff
changeset
|
322 session.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
|
323 end |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
324 end |
6366240d2edb
mod_smacks: Limit "old" session resumption counters
Kim Alvefur <zash@zash.se>
parents:
12135
diff
changeset
|
325 |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
326 local resume_token; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
327 local resume = stanza.attr.resume; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
328 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
|
329 resume_token = new_id(); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
330 end |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
331 |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
332 return { |
12719
268b1a9162a9
mod_smacks: Add type field to results so actions can be later distinguished
Matthew Wild <mwild1@gmail.com>
parents:
12691
diff
changeset
|
333 type = "enabled"; |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
334 id = resume_token; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
335 resume_max = resume_token and tostring(resume_timeout) or nil; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
336 session = session; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
337 finish = function () |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
338 session.log("debug", "Enabling stream management"); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
339 |
12720
0a137436490f
mod_smacks: Set session flag during successful enable
Matthew Wild <mwild1@gmail.com>
parents:
12719
diff
changeset
|
340 session.smacks = stanza.attr.xmlns; |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
341 track_session(session, resume_token); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
342 wrap_session(session, false); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
343 end; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
344 }; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
345 end |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
346 |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
347 function handle_enable(session, stanza, xmlns_sm) |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
348 local enabled, err = do_enable(session, stanza); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
349 if not enabled then |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
350 (session.sends2s or session.send)(st.stanza("failed", { xmlns = xmlns_sm }):add_error(err)); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
351 return true; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
352 end |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
353 |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
354 (session.sends2s or session.send)(st.stanza("enabled", { |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
355 xmlns = xmlns_sm; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
356 id = enabled.id; |
12745
2cbf0e9314ff
mod_smacks: Change boolean attribute from '1' to 'true' for compatibility
Matthew Wild <mwild1@gmail.com>
parents:
12739
diff
changeset
|
357 resume = enabled.id and "true" or nil; -- COMPAT w/ Conversations 2.10.10 requires 'true' not '1' |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
358 max = enabled.resume_max; |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
359 })); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
360 |
12691
90d90b540b6b
mod_smacks: Set session.smacks after sending <enabled/> to fix traceback
Matthew Wild <mwild1@gmail.com>
parents:
12689
diff
changeset
|
361 session.smacks = xmlns_sm; |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
362 enabled.finish(); |
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
363 |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
364 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
365 end |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
366 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
|
367 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
|
368 |
12471
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
369 module:hook_tag("http://etherx.jabber.org/streams", "features", function(session, stanza) |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
370 if can_do_smacks(session) then |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
371 session.smacks_feature = stanza:get_child("sm", xmlns_sm3) or stanza:get_child("sm", xmlns_sm2); |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
372 end |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
373 end); |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
374 |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
375 module:hook("s2sout-established", function (event) |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
376 local session = event.session; |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
377 if not session.smacks_feature then return end |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
378 |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
379 session.smacks = session.smacks_feature.attr.xmlns; |
12504
c589874fe348
mod_smacks: Initialize queue before sending <enable>
Kim Alvefur <zash@zash.se>
parents:
12471
diff
changeset
|
380 wrap_session_out(session, false); |
12471
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
381 session.sends2s(st.stanza("enable", { xmlns = session.smacks })); |
a3b12eeedd4b
mod_smacks: Improve activation of smacks on outgoing s2s
Kim Alvefur <zash@zash.se>
parents:
12272
diff
changeset
|
382 end); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
383 |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
384 function handle_enabled(session, stanza, xmlns_sm) -- luacheck: ignore 212/stanza |
12519
d935af51c644
mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents:
12518
diff
changeset
|
385 session.log("debug", "Enabling stream management"); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
386 session.smacks = xmlns_sm; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
387 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
388 wrap_session_in(session, false); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
389 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
390 -- FIXME Resume? |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
391 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
392 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
393 end |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
394 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
|
395 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
|
396 |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
397 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
|
398 if not origin.smacks then |
12519
d935af51c644
mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents:
12518
diff
changeset
|
399 origin.log("debug", "Received ack request from non-smack-enabled session"); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
400 return; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
401 end |
12519
d935af51c644
mod_smacks: Use session logging for remaining log messages
Kim Alvefur <zash@zash.se>
parents:
12518
diff
changeset
|
402 origin.log("debug", "Received ack request, acking for %d", origin.handled_stanza_count); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
403 -- Reply with <a> |
11977
9f7a6f7d13de
mod_smacks: Factor out formatting of 'h' value
Kim Alvefur <zash@zash.se>
parents:
11976
diff
changeset
|
404 (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
|
405 -- 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
|
406 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
|
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, "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
|
410 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
|
411 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
412 function handle_a(origin, stanza) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
413 if not origin.smacks then return; end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
414 origin.awaiting_ack = nil; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
415 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
|
416 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
|
417 origin.awaiting_ack_timer = nil; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
418 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
419 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
|
420 timer.stop(origin.delayed_ack_timer) |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
421 origin.delayed_ack_timer = nil; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
422 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
423 -- Remove handled stanzas from outgoing_stanza_queue |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
424 local h = tonumber(stanza.attr.h); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
425 if not h then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
426 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
|
427 return; |
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 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
|
430 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
|
431 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
|
432 if err then |
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
433 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
|
434 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
|
435 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
|
436 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
|
437 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
|
438 end |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
439 origin:close(err); |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
440 return; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
441 end |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
442 tx_acked_stanzas:sample(handled_stanza_count); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
443 |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
444 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
|
445 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
|
446 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
447 end |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
448 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
|
449 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
|
450 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
451 local function handle_unacked_stanzas(session) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
452 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
|
453 local unacked = queue:count_unacked() |
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
454 if unacked > 0 then |
12528
8e780079a424
mod_smacks: Indicate that bounces are generated by the server
Kim Alvefur <zash@zash.se>
parents:
12527
diff
changeset
|
455 local error_from = jid.join(session.username, session.host or module.host); |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
456 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
|
457 session.smacks = false; -- Disable queueing |
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
458 session.outgoing_stanza_queue = nil; |
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
459 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
|
460 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
|
461 if stanza.attr.type ~= "error" and stanza.attr.from ~= session.full_jid then |
12528
8e780079a424
mod_smacks: Indicate that bounces are generated by the server
Kim Alvefur <zash@zash.se>
parents:
12527
diff
changeset
|
462 local reply = st.error_reply(stanza, "cancel", "recipient-unavailable", nil, error_from); |
12526
252ed01896dd
mod_smacks: Bounce unhandled stanzas from local origin (fix #1759)
Kim Alvefur <zash@zash.se>
parents:
12525
diff
changeset
|
463 module:send(reply); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
464 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
465 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
466 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
467 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
468 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
469 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
470 -- 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
|
471 -- 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
|
472 -- 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
|
473 module:hook("delivery/failure", function(event) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
474 local session, stanza = event.session, event.stanza; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
475 -- Only deal with authenticated (c2s) sessions |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
476 if session.username then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
477 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
|
478 ( 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
|
479 -- 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
|
480 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
|
481 if mam_result ~= nil then |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
482 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
|
483 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
484 -- 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
|
485 -- 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
|
486 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
|
487 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
|
488 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
|
489 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
|
490 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
|
491 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
492 -- 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
|
493 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
|
494 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
|
495 local ok = module:fire_event("message/offline/handle", { origin = session, username = session.username, stanza = stanza }); |
12048 | 496 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
|
497 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
|
498 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
499 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
500 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
501 end); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
502 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
503 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
|
504 local session = event.session; |
12054
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
505 if not session.smacks then return end |
12060 | 506 if not session.resumption_token then |
507 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
|
508 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
|
509 session.log("debug", "Destroying session with %d unacked stanzas", queue:count_unacked()); |
12060 | 510 handle_unacked_stanzas(session); |
511 end | |
12054
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
512 return |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
513 end |
12072
ef0f174488af
mod_smacks: Fix duplicate sleep behavior when replacing a session
Kim Alvefur <zash@zash.se>
parents:
12070
diff
changeset
|
514 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
|
515 |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
516 session.hibernating = os_time(); |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
517 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
|
518 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
|
519 if session.destroyed then |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
520 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
|
521 return |
12061
31a7e0ac6928
mod_smacks: Skip hibernation logic if session was closed or replaced
Kim Alvefur <zash@zash.se>
parents:
12060
diff
changeset
|
522 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
|
523 -- 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
|
524 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
|
525 return |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
526 end |
12054
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
527 |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
528 session.log("debug", "Destroying session for hibernating too long"); |
12518
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
529 save_old_session(session); |
12054
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
530 session.resumption_token = nil; |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
531 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
|
532 sessions_expired(1); |
12054
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
533 end); |
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
534 if session.conn then |
12070
e662c172ea0f
mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents:
12069
diff
changeset
|
535 local conn = session.conn; |
e662c172ea0f
mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents:
12069
diff
changeset
|
536 c2s_sessions[conn] = nil; |
e662c172ea0f
mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents:
12069
diff
changeset
|
537 session.conn = nil; |
e662c172ea0f
mod_smacks: Remove references to connection on hibernation
Kim Alvefur <zash@zash.se>
parents:
12069
diff
changeset
|
538 conn:close(); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
539 end |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
540 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
|
541 return true; -- Postpone destruction for now |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
542 end); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
543 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
544 local function handle_s2s_destroyed(event) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
545 local session = event.session; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
546 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
|
547 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
|
548 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
|
549 if s2s_resend then |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
550 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
|
551 module:send(stanza); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
552 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
553 session.outgoing_stanza_queue = nil; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
554 else |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
555 handle_unacked_stanzas(session); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
556 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
557 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
558 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
559 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
560 module:hook("s2sout-destroyed", handle_s2s_destroyed); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
561 module:hook("s2sin-destroyed", handle_s2s_destroyed); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
562 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
563 function do_resume(session, stanza) |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
564 if session.full_jid then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
565 session.log("warn", "Tried to resume after resource binding"); |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
566 return nil, enable_errors.new("already_bound"); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
567 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
568 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
569 local id = stanza.attr.previd; |
12053
03e9587fbfd2
mod_smacks: Switch storage for tracking resumption tokens
Kim Alvefur <zash@zash.se>
parents:
12052
diff
changeset
|
570 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
|
571 if not original_session then |
12051
c32ef09ab452
mod_smacks: Persist old counter values to storage
Kim Alvefur <zash@zash.se>
parents:
12050
diff
changeset
|
572 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
|
573 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
|
574 session.log("debug", "Tried to resume old expired session with id %s", id); |
12518
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
575 clear_old_session(session, id); |
12125
649268c9f603
mod_smacks: sprinkle some metrics on it
Jonas Schäfer <jonas@wielicki.name>
parents:
12114
diff
changeset
|
576 resumption_expired(1); |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
577 return nil, enable_errors.new("expired", { h = old_session.h }); |
12054
0116fa57f05c
mod_smacks: Set a watchdog to watch sleeping sessions
Kim Alvefur <zash@zash.se>
parents:
12053
diff
changeset
|
578 end |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
579 session.log("debug", "Tried to resume non-existent session with id %s", id); |
12688
36ba170c4fd0
mod_smacks: Split enable handling to stages, to allow easier SASL2 integration
Matthew Wild <mwild1@gmail.com>
parents:
12682
diff
changeset
|
580 return nil, enable_errors.new("unknown_session"); |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
581 end |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12550
diff
changeset
|
582 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
583 if original_session.hibernating_watchdog then |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
584 original_session.log("debug", "Letting the watchdog go"); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
585 original_session.hibernating_watchdog:cancel(); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
586 original_session.hibernating_watchdog = nil; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
587 elseif session.hibernating then |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
588 original_session.log("error", "Hibernating session has no watchdog!") |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
589 end |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
590 -- zero age = was not hibernating yet |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
591 local age = 0; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
592 if original_session.hibernating then |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
593 local now = os_time(); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
594 age = now - original_session.hibernating; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
595 end |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
596 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
597 session.log("debug", "mod_smacks resuming existing session %s...", original_session.id); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
598 |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
599 local queue = original_session.outgoing_stanza_queue; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
600 local h = tonumber(stanza.attr.h); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
601 |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
602 original_session.log("debug", "Pre-resumption #queue = %d", queue:count_unacked()) |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
603 local acked, err = ack_errors.coerce(queue:ack(h)); -- luacheck: ignore 211/acked |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
604 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
605 if not err and not queue:resumable() then |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
606 err = ack_errors.new("overflow"); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
607 end |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
608 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
609 if err then |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
610 session.log("debug", "Resumption failed: %s", err); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
611 return nil, err; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
612 end |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
613 |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
614 -- Update original_session with the parameters (connection, etc.) from the new session |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
615 sessionmanager.update_session(original_session, session); |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
616 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
617 return { |
12719
268b1a9162a9
mod_smacks: Add type field to results so actions can be later distinguished
Matthew Wild <mwild1@gmail.com>
parents:
12691
diff
changeset
|
618 type = "resumed"; |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
619 session = original_session; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
620 id = id; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
621 -- Return function to complete the resumption and resync unacked stanzas |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
622 -- This is two steps so we can support SASL2/ISR |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
623 finish = function () |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
624 -- Ok, we need to re-send any stanzas that the client didn't see |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
625 -- ...they are what is now left in the outgoing stanza queue |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
626 -- We have to use the send of "session" because we don't want to add our resent stanzas |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
627 -- 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
|
628 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
629 original_session.log("debug", "resending all unacked stanzas that are still queued after resume, #queue = %d", queue:count_unacked()); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
630 for _, queued_stanza in queue:resume() do |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
631 original_session.send(queued_stanza); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
632 end |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
633 original_session.log("debug", "all stanzas resent, enabling stream management on resumed stream, #queue = %d", queue:count_unacked()); |
12678
5a61e1603f42
mod_smacks: Don't close resuming session when failed due to overflow
Matthew Wild <mwild1@gmail.com>
parents:
12677
diff
changeset
|
634 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
635 -- Add our own handlers to the resumed session (filters have been reset in the update) |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
636 wrap_session(original_session, true); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
637 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
638 -- Let everyone know that we are no longer hibernating |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
639 module:fire_event("smacks-hibernation-end", {origin = session, resumed = original_session, queue = queue:table()}); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
640 original_session.awaiting_ack = nil; -- Don't wait for acks from before the resumption |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
641 request_ack_now_if_needed(original_session, true, "handle_resume", nil); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
642 resumption_age:sample(age); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
643 end; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
644 }; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
645 end |
12056
e62025f949f9
mod_smacks: Limit queue memory consumption using new util
Kim Alvefur <zash@zash.se>
parents:
12054
diff
changeset
|
646 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
647 function handle_resume(session, stanza, xmlns_sm) |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
648 local resumed, err = do_resume(session, stanza); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
649 if not resumed then |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
650 session.send(st.stanza("failed", { xmlns = xmlns_sm, h = format_h(err.context.h) }) |
12739
0dc80024fdd2
Backed out changeset 1bc2220cd6ec
Jonas Schäfer <jonas@wielicki.name>
parents:
12720
diff
changeset
|
651 :tag(err.condition, { xmlns = xmlns_errors })); |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
652 return true; |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
653 end |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12550
diff
changeset
|
654 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
655 session = resumed.session; |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12550
diff
changeset
|
656 |
12682
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
657 -- Inform client of successful resumption |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
658 session.send(st.stanza("resumed", { xmlns = xmlns_sm, |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
659 h = format_h(session.handled_stanza_count), previd = resumed.id })); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
660 |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
661 -- Complete resume (sync stanzas, etc.) |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
662 resumed.finish(); |
464a22f2751c
mod_smacks: Split resumption into multiple stages, to simplify ISR integration
Matthew Wild <mwild1@gmail.com>
parents:
12678
diff
changeset
|
663 |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
664 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
665 end |
12677
3b9771d496ed
mod_smacks: Long overdue cleanup of resumption code, fixes some old TODOs
Matthew Wild <mwild1@gmail.com>
parents:
12550
diff
changeset
|
666 |
11935
4d0d10fabb82
mod_smacks: Clean up compat code etc
Kim Alvefur <zash@zash.se>
parents:
11934
diff
changeset
|
667 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
|
668 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
|
669 |
11937
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
670 -- 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
|
671 -- 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
|
672 local request_ack_events = { |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
673 ["csi-client-active"] = true; |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
674 ["csi-flushing"] = false; |
11938
6da703cb4c04
mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents:
11937
diff
changeset
|
675 ["c2s-pre-ondrain"] = false; |
6da703cb4c04
mod_smacks: Optimize scheduling of ack requests
Kim Alvefur <zash@zash.se>
parents:
11937
diff
changeset
|
676 ["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
|
677 }; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
678 |
11937
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
679 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
|
680 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
|
681 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
|
682 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
|
683 end); |
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
684 end |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
685 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
686 local function handle_read_timeout(event) |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
687 local session = event.session; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
688 if session.smacks then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
689 if session.awaiting_ack then |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
690 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
|
691 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
|
692 session.awaiting_ack_timer = nil; |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
693 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
694 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
|
695 timer.stop(session.delayed_ack_timer); |
11934
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
696 session.delayed_ack_timer = nil; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
697 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
698 return false; -- Kick the session |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
699 end |
11937
364c3f018e3a
mod_smacks: Refactor ack requesting to avoid some timer roundtrips
Kim Alvefur <zash@zash.se>
parents:
11936
diff
changeset
|
700 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
|
701 return true; |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
702 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
703 end |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
704 |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
705 module:hook("s2s-read-timeout", handle_read_timeout); |
65cdb1b21db3
mod_smacks: Import from prosody-modules @ eb63890ae8fc
Kim Alvefur <zash@zash.se>
parents:
diff
changeset
|
706 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
|
707 |
12065
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
708 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
|
709 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
|
710 -- 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
|
711 return |
061d516d8ac5
mod_smacks: Fix error on shutdown if loaded on Component
Kim Alvefur <zash@zash.se>
parents:
12076
diff
changeset
|
712 end |
12065
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
713 local reason = event.reason; |
12078 | 714 -- 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
|
715 -- 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
|
716 -- 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
|
717 -- resume the lost session after a restart. |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
718 for _, user in pairs(local_sessions) do |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
719 for _, session in pairs(user.sessions) do |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
720 if session.resumption_token then |
12518
73ee3855f970
mod_smacks: Factor out some convenience functions
Kim Alvefur <zash@zash.se>
parents:
12504
diff
changeset
|
721 if save_old_session(session) then |
12064
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
722 session.resumption_token = nil; |
12065
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
723 |
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
724 -- Deal with unacked stanzas |
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
725 if session.outgoing_stanza_queue then |
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
726 handle_unacked_stanzas(session); |
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
727 end |
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
728 |
12064
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
729 if session.conn then |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
730 session.conn:close() |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
731 session.conn = nil; |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
732 -- 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
|
733 -- session since it is unconnected. |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
734 end |
12065
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
735 |
9102cbd2aec4
mod_smacks: Bounce unacked stanzas on shutdown
Kim Alvefur <zash@zash.se>
parents:
12064
diff
changeset
|
736 -- 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
|
737 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
|
738 end |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
739 end |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
740 end |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
741 end |
d2380fd5e421
mod_smacks: Preserve counter values on shutdown
Kim Alvefur <zash@zash.se>
parents:
12063
diff
changeset
|
742 end, -90); |