view util/throttle.lua @ 9879:ddc07fb8dcd4 0.11

mod_mam: Perform message expiry based on building an index by date (backport of 39ee70fbb009 from trunk) For each day, store a set of users that have new messages. To expire messages, we collect the union of sets of users from dates that fall outside the cleanup range. The previous algoritm did not work well with many users, especially with the default settings.
author Kim Alvefur <zash@zash.se>
date Fri, 22 Mar 2019 17:32:56 +0100
parents 4f0f5b49bb03
children d10957394a3c
line wrap: on
line source


local gettime = require "util.time".now
local setmetatable = setmetatable;

local _ENV = nil;
-- luacheck: std none

local throttle = {};
local throttle_mt = { __index = throttle };

function throttle:update()
	local newt = gettime();
	local elapsed = newt - self.t;
	self.t = newt;
	local balance = (self.rate * elapsed) + self.balance;
	if balance > self.max then
		self.balance = self.max;
	else
		self.balance = balance;
	end
	return self.balance;
end

function throttle:peek(cost)
	cost = cost or 1;
	return self.balance >= cost or self:update() >= cost;
end

function throttle:poll(cost, split)
	if self:peek(cost) then
		self.balance = self.balance - cost;
		return true;
	else
		local balance = self.balance;
		if split then
			self.balance = 0;
		end
		return false, balance, (cost-balance);
	end
end

local function create(max, period)
	return setmetatable({ rate = max / period, max = max, t = gettime(), balance = max }, throttle_mt);
end

return {
	create = create;
};