Mercurial > prosody-modules
comparison mod_limits/mod_limits.lua @ 2777:55a7ef2fb628
mod_limits: Handle fractional outstanding balance (imported from prosody 25237002aba4)
| author | Matthew Wild <mwild1@gmail.com> |
|---|---|
| date | Tue, 26 Sep 2017 17:51:09 +0100 |
| parents | 1c126c49f5c1 |
| children | 88b16084eda7 |
comparison
equal
deleted
inserted
replaced
| 2776:3092ae96c1f0 | 2777:55a7ef2fb628 |
|---|---|
| 6 module:set_global(); | 6 module:set_global(); |
| 7 | 7 |
| 8 local filters = require "util.filters"; | 8 local filters = require "util.filters"; |
| 9 local throttle = require "util.throttle"; | 9 local throttle = require "util.throttle"; |
| 10 local timer = require "util.timer"; | 10 local timer = require "util.timer"; |
| 11 local ceil = math.ceil; | |
| 11 | 12 |
| 12 local limits_cfg = module:get_option("limits", {}); | 13 local limits_cfg = module:get_option("limits", {}); |
| 13 local limits_resolution = module:get_option_number("limits_resolution", 1); | 14 local limits_resolution = module:get_option_number("limits_resolution", 1); |
| 14 | 15 |
| 15 local default_bytes_per_second = 3000; | 16 local default_bytes_per_second = 3000; |
| 57 local throttle = session.throttle; | 58 local throttle = session.throttle; |
| 58 if throttle then | 59 if throttle then |
| 59 local ok, balance, outstanding = throttle:poll(#bytes, true); | 60 local ok, balance, outstanding = throttle:poll(#bytes, true); |
| 60 if not ok then | 61 if not ok then |
| 61 session.log("debug", "Session over rate limit (%d) with %d (by %d), pausing", throttle.max, #bytes, outstanding); | 62 session.log("debug", "Session over rate limit (%d) with %d (by %d), pausing", throttle.max, #bytes, outstanding); |
| 63 outstanding = ceil(outstanding); | |
| 62 session.conn:pause(); -- Read no more data from the connection until there is no outstanding data | 64 session.conn:pause(); -- Read no more data from the connection until there is no outstanding data |
| 63 local outstanding_data = bytes:sub(-outstanding); | 65 local outstanding_data = bytes:sub(-outstanding); |
| 64 bytes = bytes:sub(1, #bytes-outstanding); | 66 bytes = bytes:sub(1, #bytes-outstanding); |
| 65 timer.add_task(limits_resolution, function () | 67 timer.add_task(limits_resolution, function () |
| 66 if not session.conn then return; end | 68 if not session.conn then return; end |
