From a4491e8bd952060fe5783332763ebb7726c55a4b Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 4 Nov 2021 00:33:58 +0100 Subject: mod_pep: Don't pass pubsub services across reloads Ensures configuration is refreshed, releases some memory. --- plugins/mod_pep.lua | 6 ------ 1 file changed, 6 deletions(-) (limited to 'plugins/mod_pep.lua') diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index 4dc9ecbc..5d51f196 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -36,18 +36,12 @@ local max_max_items = module:get_option_number("pep_max_items", 256); function module.save() return { - services = services; recipients = recipients; }; end function module.restore(data) - services = data.services; recipients = data.recipients; - for username, service in pairs(services) do - local user_bare = jid_join(username, host); - module:add_item("pep-service", { service = service, jid = user_bare }); - end end function is_item_stanza(item) -- cgit v1.2.3 From cc03265206ff7c693d8139bf3babfc9ace9b3928 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 4 Nov 2021 00:35:44 +0100 Subject: mod_pep: Limit possible growth of number of pubsub services --- plugins/mod_pep.lua | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) (limited to 'plugins/mod_pep.lua') diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index 5d51f196..afa3a38b 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -18,8 +18,20 @@ local lib_pubsub = module:require "pubsub"; local empty_set = set_new(); +-- username -> object passed to module:add_items() +local pep_service_items = {}; + +-- size of caches with full pubsub service objects +local service_cache_size = module:get_option_number("pep_service_cache_size", 1000); + -- username -> util.pubsub service object -local services = {}; +local services = cache.new(service_cache_size, function (username, _) + local item = pep_service_items[username]; + pep_service_items[username] = nil; + if item then + module:remove_item("pep-service", item); + end +end):table(); -- username -> recipient -> set of nodes local recipients = {}; @@ -202,7 +214,9 @@ function get_pep_service(username) check_node_config = check_node_config; }); services[username] = service; - module:add_item("pep-service", { service = service, jid = user_bare }); + local item = { service = service, jid = user_bare } + pep_service_items[username] = item; + module:add_item("pep-service", item); return service; end -- cgit v1.2.3 From 4a89e829d4f0eadf57b3bf21c41f1198171936cc Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 4 Nov 2021 00:36:41 +0100 Subject: mod_pep: Limit possible growth of node subscription info --- plugins/mod_pep.lua | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'plugins/mod_pep.lua') diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index afa3a38b..df29afdc 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -33,11 +33,14 @@ local services = cache.new(service_cache_size, function (username, _) end end):table(); +-- size of caches with smaller objects +local info_cache_size = module:get_option_number("pep_info_cache_size", 10000); + -- username -> recipient -> set of nodes -local recipients = {}; +local recipients = cache.new(info_cache_size):table(); -- caps hash -> set of nodes -local hash_map = {}; +local hash_map = cache.new(info_cache_size):table(); local host = module.host; -- cgit v1.2.3 From db0e630ad77bb5d1b725d06ae6f253214cbb92f7 Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 4 Nov 2021 00:55:59 +0100 Subject: mod_pep: Prevent creation of services for non-existent users Using a dedicated service should give identical behavior, except for a possible timing difference in the user existence lookup. --- plugins/mod_pep.lua | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'plugins/mod_pep.lua') diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index df29afdc..a96bb1aa 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -9,6 +9,7 @@ local is_contact_subscribed = require "core.rostermanager".is_contact_subscribed local cache = require "util.cache"; local set = require "util.set"; local storagemanager = require "core.storagemanager"; +local usermanager = require "core.usermanager"; local xmlns_pubsub = "http://jabber.org/protocol/pubsub"; local xmlns_pubsub_event = "http://jabber.org/protocol/pubsub#event"; @@ -174,6 +175,17 @@ local function get_subscriber_filter(username) end end +local nobody_service = pubsub.new({ + service = pubsub.new({ + node_defaults = { + ["max_items"] = 1; + ["persist_items"] = false; + ["access_model"] = "presence"; + ["send_last_published_item"] = "on_sub_and_presence"; + }; + }); +}); + function get_pep_service(username) module:log("debug", "get_pep_service(%q)", username); local user_bare = jid_join(username, host); @@ -181,6 +193,9 @@ function get_pep_service(username) if service then return service; end + if not usermanager.user_exists(username, host) then + return nobody_service; + end service = pubsub.new({ pep_username = username; node_defaults = { -- cgit v1.2.3 From ca08584d742a8bca8c93547d189529752a8cc23d Mon Sep 17 00:00:00 2001 From: Kim Alvefur Date: Thu, 4 Nov 2021 01:00:06 +0100 Subject: mod_pep: Wipe pubsub service on user deletion Data is already wiped from storage, but this ensures everything is properly unsubscribed, possibly with notifications etc. Clears recipient cache as well, since it is no longer relevant. --- plugins/mod_pep.lua | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'plugins/mod_pep.lua') diff --git a/plugins/mod_pep.lua b/plugins/mod_pep.lua index a96bb1aa..4ee3db5e 100644 --- a/plugins/mod_pep.lua +++ b/plugins/mod_pep.lua @@ -467,3 +467,18 @@ module:hook("account-disco-items", function(event) reply:tag("item", { jid = user_bare, node = node, name = node_obj.config.title }):up(); end end); + +module:hook_global("user-deleted", function(event) + if event.host ~= host then return end + local username = event.username; + local service = services[username]; + if not service then return end + for node in pairs(service.nodes) do service:delete(node, true); end + + local item = pep_service_items[username]; + pep_service_items[username] = nil; + if item then module:remove_item("pep-service", item); end + + recipients[username] = nil; +end); + -- cgit v1.2.3