mod_blocklist: Use util.cache to manage how many users blocklists are kept in memory
authorKim Alvefur <zash@zash.se>
Wed, 25 Nov 2015 21:06:01 +0100
changeset 6947 62b6f6d230f1
parent 6946 0a31ec3193f0
child 6948 d779c55058c6
mod_blocklist: Use util.cache to manage how many users blocklists are kept in memory
plugins/mod_blocklist.lua
--- a/plugins/mod_blocklist.lua	Wed Nov 25 20:49:41 2015 +0100
+++ b/plugins/mod_blocklist.lua	Wed Nov 25 21:06:01 2015 +0100
@@ -19,12 +19,13 @@
 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 @@
 		return ok, err;
 	end
 	-- Successful save, update the cache
+	cache2:set(username, blocklist);
 	cache[username] = blocklist;
 	return true;
 end
@@ -72,6 +74,9 @@
 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 @@
 		if not blocklist then
 			blocklist = migrate_privacy_list(username);
 		end
-		cache[username] = blocklist;
+		cache2:set(username, blocklist);
 	end
+	cache[username] = blocklist;
 	return blocklist;
 end