comparison mod_muc_limits/mod_muc_limits.lua @ 1038:edb06824a5a4

mod_muc_limits: Condense multiple dropped stanzas into a single log message every 5 seconds
author Matthew Wild <mwild1@gmail.com>
date Sat, 01 Jun 2013 23:21:48 +0100
parents a44e755f7579
children 6574303a8169
comparison
equal deleted inserted replaced
1037:892272432703 1038:edb06824a5a4
1 1
2 local jid = require "util.jid"; 2 local jid = require "util.jid";
3 local st = require "util.stanza"; 3 local st = require "util.stanza";
4 local new_throttle = require "util.throttle".create; 4 local new_throttle = require "util.throttle".create;
5 local t_insert, t_concat = table.insert, table.concat;
5 6
6 local xmlns_muc = "http://jabber.org/protocol/muc"; 7 local xmlns_muc = "http://jabber.org/protocol/muc";
7 8
8 local period = math.max(module:get_option_number("muc_event_rate", 0.5), 0); 9 local period = math.max(module:get_option_number("muc_event_rate", 0.5), 0);
9 local burst = math.max(module:get_option_number("muc_burst_factor", 6), 1); 10 local burst = math.max(module:get_option_number("muc_burst_factor", 6), 1);
10 11
11 local max_nick_length = module:get_option_number("muc_max_nick_length", 23); -- Default chosen through scientific methods 12 local max_nick_length = module:get_option_number("muc_max_nick_length", 23); -- Default chosen through scientific methods
13 local dropped_count = 0;
14 local dropped_jids;
15
16 local function log_dropped()
17 module:log("warn", "Dropped %d stanzas from %d JIDs: %s", dropped_count, #dropped_jids, t_concat(dropped_jids, ", "));
18 dropped_count = 0;
19 dropped_jids = nil;
20 end
12 21
13 local function handle_stanza(event) 22 local function handle_stanza(event)
14 local origin, stanza = event.origin, event.stanza; 23 local origin, stanza = event.origin, event.stanza;
15 if stanza.name == "presence" and stanza.attr.type == "unavailable" then -- Don't limit room leaving 24 if stanza.name == "presence" and stanza.attr.type == "unavailable" then -- Don't limit room leaving
16 return; 25 return;
33 if not room.throttle then 42 if not room.throttle then
34 throttle = new_throttle(period*burst, burst); 43 throttle = new_throttle(period*burst, burst);
35 room.throttle = throttle; 44 room.throttle = throttle;
36 end 45 end
37 if not throttle:poll(1) then 46 if not throttle:poll(1) then
38 module:log("warn", "Dropping stanza for %s@%s from %s, over rate limit", dest_room, dest_host, from_jid); 47 module:log("debug", "Dropping stanza for %s@%s from %s, over rate limit", dest_room, dest_host, from_jid);
48 if not dropped_jids then
49 dropped_jids = { [from_jid] = true, from_jid };
50 module:add_timer(5, log_dropped);
51 elseif not dropped_jids[from_jid] then
52 dropped_jids[from_jid] = true;
53 t_insert(dropped_jids, from_jid);
54 end
55 dropped_count = dropped_count + 1;
39 local reply = st.error_reply(stanza, "wait", "policy-violation", "The room is currently overactive, please try again later"); 56 local reply = st.error_reply(stanza, "wait", "policy-violation", "The room is currently overactive, please try again later");
40 local body = stanza:get_child_text("body"); 57 local body = stanza:get_child_text("body");
41 if body then 58 if body then
42 reply:up():tag("body"):text(body):up(); 59 reply:up():tag("body"):text(body):up();
43 end 60 end