Comparison

mod_muc_limits/mod_muc_limits.lua @ 3188:5c3f3f5a4377

Backed out parts of changeset a81456a13797
author Kim Alvefur <zash@zash.se>
date Wed, 18 Jul 2018 15:57:13 +0200
parent 3098:a81456a13797
child 3402:6a3060d5e85d
comparison
equal deleted inserted replaced
3187:7c450c27d4ba 3188:5c3f3f5a4377
23 module:log("warn", "Dropped %d stanzas from %d JIDs: %s", dropped_count, #dropped_jids, t_concat(dropped_jids, ", ")); 23 module:log("warn", "Dropped %d stanzas from %d JIDs: %s", dropped_count, #dropped_jids, t_concat(dropped_jids, ", "));
24 dropped_count = 0; 24 dropped_count = 0;
25 dropped_jids = nil; 25 dropped_jids = nil;
26 end 26 end
27 27
28 local function get_non_outcast_affiliations(room)
29 local nmembers = 0;
30 -- this is an evil hack, we probably should not access _affiliations
31 -- directly ...
32 for _, aff in pairs(room._affiliations) do
33 if aff ~= "outcast" then
34 nmembers = nmembers + 1;
35 end
36 end
37 return nmembers;
38 end
39
40 local function handle_stanza(event) 28 local function handle_stanza(event)
41 local origin, stanza = event.origin, event.stanza; 29 local origin, stanza = event.origin, event.stanza;
42 if stanza.name == "presence" and stanza.attr.type == "unavailable" then -- Don't limit room leaving 30 if stanza.name == "presence" and stanza.attr.type == "unavailable" then -- Don't limit room leaving
43 return; 31 return;
44 end 32 end
59 local throttle = room.throttle; 47 local throttle = room.throttle;
60 if not room.throttle then 48 if not room.throttle then
61 throttle = new_throttle(period*burst, burst); 49 throttle = new_throttle(period*burst, burst);
62 room.throttle = throttle; 50 room.throttle = throttle;
63 end 51 end
64 52 if not throttle:poll(1) then
65 local cost = 1;
66 -- we scale the cost by the inverse of the square root of the number of
67 -- members; this should effectively raise the limit by a factor of
68 -- sqrt(nmembers)
69 local nmembers = math.max(get_non_outcast_affiliations(room), 1);
70 cost = cost / math.sqrt(nmembers);
71
72 if not throttle:poll(cost) then
73 module:log("debug", "Dropping stanza for %s@%s from %s, over rate limit", dest_room, dest_host, from_jid); 53 module:log("debug", "Dropping stanza for %s@%s from %s, over rate limit", dest_room, dest_host, from_jid);
74 if not dropped_jids then 54 if not dropped_jids then
75 dropped_jids = { [from_jid] = true, from_jid }; 55 dropped_jids = { [from_jid] = true, from_jid };
76 module:add_timer(5, log_dropped); 56 module:add_timer(5, log_dropped);
77 elseif not dropped_jids[from_jid] then 57 elseif not dropped_jids[from_jid] then