aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Wild <mwild1@gmail.com>2023-03-23 14:40:51 +0000
committerMatthew Wild <mwild1@gmail.com>2023-03-23 14:40:51 +0000
commit8e325c229fef8833a1fa07387963e26c90a7436f (patch)
tree2c5e256b606f7faeb4286b4ac21d84a94b1f102c
parent893366fb799968fcd88339812e8291bc4f06bee1 (diff)
downloadprosody-8e325c229fef8833a1fa07387963e26c90a7436f.tar.gz
prosody-8e325c229fef8833a1fa07387963e26c90a7436f.zip
mod_debug_reset: New module to "reset" a running server (e.g. for testing)
Plan to use this for integration tests.
-rw-r--r--plugins/mod_debug_reset.lua41
1 files changed, 41 insertions, 0 deletions
diff --git a/plugins/mod_debug_reset.lua b/plugins/mod_debug_reset.lua
new file mode 100644
index 00000000..cd08d960
--- /dev/null
+++ b/plugins/mod_debug_reset.lua
@@ -0,0 +1,41 @@
+-- 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 "core.hostmanager";
+local modulemanager = require "core.modulemanager";
+
+local timer = require "util.timer";
+
+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);
+ timer.add_task(0, function ()
+ hostmanager.activate(host);
+ module:log("info", "Reset complete");
+ module:fire_event("server-reset");
+ end);
+ end
+end
+
+function module.add_host(host_module)
+ host_module:hook("resource-unbind", function ()
+ if next(prosody.full_sessions) == nil then
+ timer.add_task(0, do_reset);
+ end
+ end);
+end
+
+local console_env = module:shared("/*/admin_shell/env");
+console_env.debug_reset = {
+ reset = do_reset;
+};