Mercurial > prosody-modules
diff mod_cloud_notify/mod_cloud_notify.lua @ 3979:6bf362008052
mod_cloud_notify: make stanza queue processing faster
author | tmolitor <thilo@eightysoft.de> |
---|---|
date | Sun, 19 Apr 2020 08:12:21 +0200 |
parents | f5e6368a1c39 |
children | 42682505e692 |
line wrap: on
line diff
--- a/mod_cloud_notify/mod_cloud_notify.lua Sat Apr 18 15:43:08 2020 +0200 +++ b/mod_cloud_notify/mod_cloud_notify.lua Sun Apr 19 08:12:21 2020 +0200 @@ -375,25 +375,29 @@ local notified = { unimportant = false; important = false } for i=1, #queue do local stanza = queue[i]; - local node = get_push_settings(stanza, session); - stanza_type = "unimportant" - if dummy_body and is_important(stanza) then stanza_type = "important"; end - if not notified[stanza_type] then -- only notify if we didn't try to push for this stanza type already - -- session.log("debug", "Invoking cloud handle_notify_request() for smacks queued stanza: %d", i); - if handle_notify_request(stanza, node, user_push_services, false) ~= 0 then - if session.hibernating and not session.first_hibernated_push then - -- if important stanzas are treated differently (pushed with last-message-body field set to dummy string) - -- and the message was important (e.g. had a last-message-body field) OR if we treat all pushes equally, - -- then record the time of first push in the session for the smack module which will extend its hibernation - -- timeout based on the value of session.first_hibernated_push - if not dummy_body or (dummy_body and is_important(stanza)) then - session.first_hibernated_push = os_time(); + -- fast ignore of already pushed stanzas + if stanza and not (stanza._push_notify and stanza._push_notify[session.push_identifier]) then + local node = get_push_settings(stanza, session); + stanza_type = "unimportant" + if dummy_body and is_important(stanza) then stanza_type = "important"; end + if not notified[stanza_type] then -- only notify if we didn't try to push for this stanza type already + -- session.log("debug", "Invoking cloud handle_notify_request() for smacks queued stanza: %d", i); + if handle_notify_request(stanza, node, user_push_services, false) ~= 0 then + if session.hibernating and not session.first_hibernated_push then + -- if important stanzas are treated differently (pushed with last-message-body field set to dummy string) + -- if the message was important (e.g. had a last-message-body field) OR if we treat all pushes equally, + -- then record the time of first push in the session for the smack module which will extend its hibernation + -- timeout based on the value of session.first_hibernated_push + if not dummy_body or (dummy_body and is_important(stanza)) then + session.first_hibernated_push = os_time(); + end end + session.log("debug", "Cloud handle_notify_request() > 0, not notifying for other %s queued stanzas of type %s", queue_type, stanza_type); + notified[stanza_type] = true end - session.log("debug", "Cloud handle_notify_request() > 0, not notifying for other %s queued stanzas of type %s", queue_type, stanza_type); - notified[stanza_type] = true end end + if notified.unimportant and notified.important then break; end -- stop processing the queue if all push types are exhausted end end