aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKim Alvefur <zash@zash.se>2015-11-25 21:06:01 +0100
committerKim Alvefur <zash@zash.se>2015-11-25 21:06:01 +0100
commit13d34d918fa517490a16ad08ea1485eb68f21cca (patch)
tree7df42318de99047b83665590fdd043cd9e1259d3
parentdd9e60beba3cdea9b29aff668a4af411f03918b9 (diff)
downloadprosody-13d34d918fa517490a16ad08ea1485eb68f21cca.tar.gz
prosody-13d34d918fa517490a16ad08ea1485eb68f21cca.zip
mod_blocklist: Use util.cache to manage how many users blocklists are kept in memory
-rw-r--r--plugins/mod_blocklist.lua20
1 files changed, 13 insertions, 7 deletions
diff --git a/plugins/mod_blocklist.lua b/plugins/mod_blocklist.lua
index 8589c1e9..65fc70b7 100644
--- a/plugins/mod_blocklist.lua
+++ b/plugins/mod_blocklist.lua
@@ -19,12 +19,13 @@ local jid_split = require"util.jid".split;
local storage = module:open_store();
local sessions = prosody.hosts[module.host].sessions;
--- Cache of blocklists used since module was loaded
-local cache = {};
-if module:get_option_boolean("blocklist_weak_cache") then
- -- Lower memory usage, more IO and latency
- setmetatable(cache, { __mode = "v" });
-end
+-- Cache of blocklists by username may randomly expire at any time
+local cache = setmetatable({}, { __mode = "v" });
+
+-- Second level of caching, keeps a fixed number of items,
+-- also anchors items in the above cache
+local cache_size = module:get_option_number("blocklist_cache_size", 64);
+local cache2 = require"util.cache".new(cache_size);
local null_blocklist = {};
@@ -36,6 +37,7 @@ local function set_blocklist(username, blocklist)
return ok, err;
end
-- Successful save, update the cache
+ cache2:set(username, blocklist);
cache[username] = blocklist;
return true;
end
@@ -72,6 +74,9 @@ end
local function get_blocklist(username)
local blocklist = cache[username];
if not blocklist then
+ blocklist = cache2:get(username);
+ end
+ if not blocklist then
if not user_exists(username, module.host) then
return null_blocklist;
end
@@ -79,8 +84,9 @@ local function get_blocklist(username)
if not blocklist then
blocklist = migrate_privacy_list(username);
end
- cache[username] = blocklist;
+ cache2:set(username, blocklist);
end
+ cache[username] = blocklist;
return blocklist;
end