Diff

core/rostermanager.lua @ 10569:fdc2bae50100 0.11

core.rostermanager: Cache rosters of offline users for faster access (fixes #1233) (grafted from 42a3e3a2824822cef7640ac56d182c59bdd4224e)
author Kim Alvefur <zash@zash.se>
date Sun, 16 Dec 2018 02:56:11 +0100
parent 9303:72f0862978ef
child 10570:962efe23975d
line wrap: on
line diff
--- a/core/rostermanager.lua	Tue Dec 24 01:01:05 2019 +0100
+++ b/core/rostermanager.lua	Sun Dec 16 02:56:11 2018 +0100
@@ -12,6 +12,7 @@
 local log = require "util.logger".init("rostermanager");
 
 local new_id = require "util.id".short;
+local new_cache = require "util.cache".new;
 
 local pairs = pairs;
 local tostring = tostring;
@@ -111,6 +112,23 @@
 	else -- Attempt to load roster for non-loaded user
 		log("debug", "load_roster: loading for offline user: %s", jid);
 	end
+	local roster_cache = hosts[host] and hosts[host].roster_cache;
+	if not roster_cache then
+		if hosts[host] then
+			roster_cache = new_cache(1024);
+			hosts[host].roster_cache = roster_cache;
+		end
+	else
+		roster = roster_cache:get(jid);
+		if roster then
+			log("debug", "load_roster: cache hit");
+			roster_cache:set(jid, roster);
+			if user then user.roster = roster; end
+			return roster;
+		else
+			log("debug", "load_roster: cache miss, loading from storage");
+		end
+	end
 	local roster_store = storagemanager.open(host, "roster", "keyval");
 	local data, err = roster_store:get(username);
 	roster = data or {};
@@ -134,6 +152,10 @@
 	if not err then
 		hosts[host].events.fire_event("roster-load", { username = username, host = host, roster = roster });
 	end
+	if roster_cache and not user then
+		log("debug", "load_roster: caching loaded roster");
+		roster_cache:set(jid, roster);
+	end
 	return roster, err;
 end