Mercurial > prosody-modules
changeset 4324:45dcf5d4cd6c
mod_cloud_notify: fix push flooding on delayed acks
Under some circumstances the delayed-ack handling caused a push flood,
this commit prevents this and caps pushes at one push per second only.
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Mon, 11 Jan 2021 22:48:17 +0100 |
parents | a7a06c8cea37 |
children | 9b95241c6ae5 |
files | mod_cloud_notify/mod_cloud_notify.lua |
diffstat | 1 files changed, 19 insertions(+), 8 deletions(-) [+] |
line wrap: on
line diff
--- a/mod_cloud_notify/mod_cloud_notify.lua Mon Jan 11 16:11:08 2021 +0100 +++ b/mod_cloud_notify/mod_cloud_notify.lua Mon Jan 11 22:48:17 2021 +0100 @@ -410,9 +410,7 @@ end -- publish on unacked smacks message (use timer to send out push for all stanzas submitted in a row only once) -local function process_smacks_stanza(event) - local session = event.origin; - local stanza = event.stanza; +local function process_stanza(session, stanza) if session.push_identifier then session.log("debug", "adding new stanza to push_queue"); if not session.push_queue then session.push_queue = {}; end @@ -420,18 +418,27 @@ queue[#queue+1] = st.clone(stanza); if #queue == 1 then -- first stanza --> start timer session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanza (in a moment)"); - session.awaiting_push_timer = module:add_timer(1e-06, function () + session.awaiting_push_timer = module:add_timer(1.0, function () session.log("debug", "Invoking cloud handle_notify_request() for newly smacks queued stanzas (now in timer)"); process_stanza_queue(session.push_queue, session, "push"); session.push_queue = {}; -- clean up queue after push + session.awaiting_push_timer = nil; end); end - else + end + return stanza; +end + +local function process_smacks_stanza(event) + local session = event.origin; + local stanza = event.stanza; + if not session.push_identifier then session.log("debug", "NOT invoking cloud handle_notify_request() for newly smacks queued stanza (session.push_identifier is not set: %s)", session.push_identifier ); + else + process_stanza(session, stanza) end - return stanza; end -- smacks hibernation is started @@ -456,8 +463,12 @@ local function ack_delayed(event) local session = event.origin; local queue = event.queue; - -- process unacked stanzas (handle_notify_request() will only send push requests for new stanzas) - process_stanza_queue(queue, session, "smacks"); + if not session.push_identifier then return; end + for i=1, #queue do + local stanza = queue[i]; + -- process unacked stanzas (handle_notify_request() will only send push requests for new stanzas) + process_stanza(session, stanza); + end end -- archive message added