comparison mod_smacks/mod_smacks.lua @ 3646:58047d6f2b89

mod_smacks: fix bug #1405 (prevent timer from running for already destroyed sessions)
author tmolitor <thilo@eightysoft.de>
date Sun, 11 Aug 2019 02:58:56 +0200
parents b2f32b3c6ec1
children b5d367798570
comparison
equal deleted inserted replaced
3645:413ea67597d2 3646:58047d6f2b89
3 -- Copyright (C) 2010-2015 Matthew Wild 3 -- Copyright (C) 2010-2015 Matthew Wild
4 -- Copyright (C) 2010 Waqas Hussain 4 -- Copyright (C) 2010 Waqas Hussain
5 -- Copyright (C) 2012-2015 Kim Alvefur 5 -- Copyright (C) 2012-2015 Kim Alvefur
6 -- Copyright (C) 2012 Thijs Alkemade 6 -- Copyright (C) 2012 Thijs Alkemade
7 -- Copyright (C) 2014 Florian Zeitz 7 -- Copyright (C) 2014 Florian Zeitz
8 -- Copyright (C) 2016-2017 Thilo Molitor 8 -- Copyright (C) 2016-2019 Thilo Molitor
9 -- 9 --
10 -- This project is MIT/X11 licensed. Please see the 10 -- This project is MIT/X11 licensed. Please see the
11 -- COPYING file in the source package for more information. 11 -- COPYING file in the source package for more information.
12 -- 12 --
13 13
114 timer; 114 timer;
115 }; 115 };
116 end 116 end
117 117
118 local function delayed_ack_function(session) 118 local function delayed_ack_function(session)
119 -- fire event only if configured to do so and our session is not hibernated or destroyed 119 -- fire event only if configured to do so and our session is not already hibernated or destroyed
120 if delayed_ack_timeout > 0 and session.awaiting_ack 120 if delayed_ack_timeout > 0 and session.awaiting_ack
121 and not session.hibernating and not session.destroyed then 121 and not session.hibernating and not session.destroyed then
122 session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d", 122 session.log("debug", "Firing event 'smacks-ack-delayed', queue = %d",
123 session.outgoing_stanza_queue and #session.outgoing_stanza_queue or 0); 123 session.outgoing_stanza_queue and #session.outgoing_stanza_queue or 0);
124 module:fire_event("smacks-ack-delayed", {origin = session, queue = session.outgoing_stanza_queue}); 124 module:fire_event("smacks-ack-delayed", {origin = session, queue = session.outgoing_stanza_queue});
169 if (#queue > max_unacked_stanzas and expected_h ~= session.last_requested_h) or force then 169 if (#queue > max_unacked_stanzas and expected_h ~= session.last_requested_h) or force then
170 session.log("debug", "Queuing <r> (in a moment) from %s - #queue=%d", reason, #queue); 170 session.log("debug", "Queuing <r> (in a moment) from %s - #queue=%d", reason, #queue);
171 session.awaiting_ack = false; 171 session.awaiting_ack = false;
172 session.awaiting_ack_timer = stoppable_timer(1e-06, function () 172 session.awaiting_ack_timer = stoppable_timer(1e-06, function ()
173 -- session.log("debug", "*** SMACKS(3) ***: awaiting_ack=%s, hibernating=%s", tostring(session.awaiting_ack), tostring(session.hibernating)); 173 -- session.log("debug", "*** SMACKS(3) ***: awaiting_ack=%s, hibernating=%s", tostring(session.awaiting_ack), tostring(session.hibernating));
174 if not session.awaiting_ack and not session.hibernating then 174 -- only request ack if needed and our session is not already hibernated or destroyed
175 if not session.awaiting_ack and not session.hibernating and not session.destroyed then
175 session.log("debug", "Sending <r> (inside timer, before send) from %s - #queue=%d", reason, #queue); 176 session.log("debug", "Sending <r> (inside timer, before send) from %s - #queue=%d", reason, #queue);
176 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks })) 177 (session.sends2s or session.send)(st.stanza("r", { xmlns = session.smacks }))
177 session.awaiting_ack = true; 178 session.awaiting_ack = true;
178 -- expected_h could be lower than this expression e.g. more stanzas added to the queue meanwhile) 179 -- expected_h could be lower than this expression e.g. more stanzas added to the queue meanwhile)
179 session.last_requested_h = session.last_acknowledged_stanza + #queue; 180 session.last_requested_h = session.last_acknowledged_stanza + #queue;