view plugins/mod_debug_reset.lua @ 14144:e38916e22f59 13.0

mod_limits: Only count connections with associated sessions I suspect some (all??) network backends and some edge cases cause ondisconnect to be called more than once. mod_c2s and mod_s2s already handle this, skipping cleanup if there is no session associated. Sessions are assigned very early on in onconnect, so it seems like a reliable way of counting.
author Matthew Wild <mwild1@gmail.com>
date Fri, 17 Apr 2026 19:42:44 +0100
parents 368df9b2d511
children
line wrap: on
line source

-- This module will "reset" the server when the client connection count drops
-- to zero. This is somewhere between a reload and a full process restart.
-- It is useful to ensure isolation between test runs, for example. It may
-- also be of use for some kinds of manual testing.

module:set_global();

local hostmanager = require "prosody.core.hostmanager";

local function do_reset()
	module:log("info", "Performing reset...");
	local hosts = {};
	for host in pairs(prosody.hosts) do
		table.insert(hosts, host);
	end
	module:fire_event("server-resetting");
	for _, host in ipairs(hosts) do
		hostmanager.deactivate(host);
		for _ = 1, 4 do
			-- Run a few cycles to ensure full cleanup, including
			-- weak tables and finalizers
			collectgarbage("collect");
		end
		hostmanager.activate(host);
		module:log("info", "Reset complete");
		module:fire_event("server-reset");
	end
end

function module.add_host(host_module)
	host_module:hook("resource-unbind", function ()
		if next(prosody.full_sessions) == nil then
			do_reset();
		end
	end);
end

local console_env = module:shared("/*/admin_shell/env");
console_env.debug_reset = {
	reset = do_reset;
};