view plugins/mod_debug_reset.lua @ 13765:7c57fb2ffbb0 13.0

mod_websocket: Merge session close handling changes from mod_c2s (bug fixes) This should bring some fixes and general robustness that mod_websocket had missed out on. The duplicated code here is not at all ideal. To prevent this happening again, we should figure out how to have the common logic in a single place, while still being able to do the websocket-specific parts that we need. The main known bug that this fixes is that it's possible for a session to get into a non-destroyable state. For example, if we try to session:close() a hibernating session, then session.conn is nil and the function will simply return without doing anything. In the mod_c2s code we already handle this, and just destroy the session. But if a hibernating websocket session is never resumed or becomes non-resumable, it will become immortal! By merging the fix from mod_c2s, the session should now be correctly destroyed.
author Matthew Wild <mwild1@gmail.com>
date Tue, 11 Mar 2025 18:44:40 +0000
parents 8ad432953300
children 8f50e7e43df4
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);
		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;
};