Software /
code /
prosody
Comparison
plugins/mod_csi_simple.lua @ 11926:99444bf26a3d
mod_csi_simple: Allow some straggler traffic after flushing buffer
Statistics from my server shows a high rate of very short buffer hold
times, most of which are the result of replies to pings or other iq
traffic, or mod_smacks acks and ack requests just after a flush was
completed.
This grace period should eliminate noise and quick flipping between
flushing and inactive mode.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Sat, 20 Nov 2021 19:23:08 +0100 |
parent | 11919:fae5441fc6cf |
child | 11927:4d63d8ef1cf9 |
comparison
equal
deleted
inserted
replaced
11925:3e0d03a74285 | 11926:99444bf26a3d |
---|---|
8 | 8 |
9 local jid = require "util.jid"; | 9 local jid = require "util.jid"; |
10 local st = require "util.stanza"; | 10 local st = require "util.stanza"; |
11 local dt = require "util.datetime"; | 11 local dt = require "util.datetime"; |
12 local filters = require "util.filters"; | 12 local filters = require "util.filters"; |
13 local timer = require "util.timer"; | |
13 | 14 |
14 local queue_size = module:get_option_number("csi_queue_size", 256); | 15 local queue_size = module:get_option_number("csi_queue_size", 256); |
16 local resume_delay = module:get_option_number("csi_resume_inactive_delay", 5); | |
15 | 17 |
16 local important_payloads = module:get_option_set("csi_important_payloads", { }); | 18 local important_payloads = module:get_option_set("csi_important_payloads", { }); |
17 | 19 |
18 function is_important(stanza) --> boolean, reason: string | 20 function is_important(stanza) --> boolean, reason: string |
19 if stanza == " " then | 21 if stanza == " " then |
192 module:hook("pre-resource-unbind", function (event) | 194 module:hook("pre-resource-unbind", function (event) |
193 local session = event.session; | 195 local session = event.session; |
194 disable_optimizations(session); | 196 disable_optimizations(session); |
195 end, 1); | 197 end, 1); |
196 | 198 |
197 module:hook("c2s-ondrain", function (event) | 199 local function resume_optimizations(_, _, session) |
198 local session = event.session; | 200 if (session.state == "flushing" or session.state == "inactive") and session.conn and session.conn.pause_writes then |
199 if (session.state == "flushing" or session.state == "inactive") and session.conn and session.conn.pause_writes then | |
200 session.state = "inactive"; | 201 session.state = "inactive"; |
201 session.conn:pause_writes(); | 202 session.conn:pause_writes(); |
202 session.csi_measure_buffer_hold = measure_buffer_hold(); | 203 session.csi_measure_buffer_hold = measure_buffer_hold(); |
203 session.log("debug", "Buffer flushed, resuming inactive mode (queue size was %d)", session.csi_counter); | 204 session.log("debug", "Buffer flushed, resuming inactive mode (queue size was %d)", session.csi_counter); |
204 session.csi_counter = 0; | 205 session.csi_counter = 0; |
206 end | |
207 session.csi_resume = nil; | |
208 end | |
209 | |
210 module:hook("c2s-ondrain", function (event) | |
211 local session = event.session; | |
212 if (session.state == "flushing" or session.state == "inactive") and session.conn and session.conn.pause_writes then | |
213 -- After flushing, remain in pseudo-flushing state for a moment to allow | |
214 -- some followup traffic, iq replies, smacks acks to be sent without having | |
215 -- to go back and forth between inactive and flush mode. | |
216 if not session.csi_resume then | |
217 session.csi_resume = timer.add_task(resume_delay, resume_optimizations, session); | |
218 end | |
219 -- Should further noise in this short grace period push back the delay? | |
220 -- Probably not great if the session can be kept in pseudo-active mode | |
221 -- indefinitely. | |
205 end | 222 end |
206 end); | 223 end); |
207 | 224 |
208 function module.load() | 225 function module.load() |
209 for _, user_session in pairs(prosody.hosts[module.host].sessions) do | 226 for _, user_session in pairs(prosody.hosts[module.host].sessions) do |