diff mod_graceful_shutdown/mod_graceful_shutdown.lua @ 2170:4652a112a4ba

mod_graceful_shutdown: Experiment in improving the shutdown experience
author Kim Alvefur <zash@zash.se>
date Thu, 05 May 2016 15:43:01 +0200
parents
children 8dbaa5e753f3
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mod_graceful_shutdown/mod_graceful_shutdown.lua	Thu May 05 15:43:01 2016 +0200
@@ -0,0 +1,42 @@
+-- luacheck: ignore 122/prosody 113/prosody
+
+local timer = require "util.timer";
+local portman = require "core.portmanager";
+local server = require "net.server";
+
+module:set_global();
+local orig_shutdown = prosody.shutdown;
+
+local pause = module:get_option_number("shutdown_pause", 1);
+
+function module.unload()
+	prosody.shutdown = orig_shutdown;
+end
+
+prosody.shutdown = coroutine.wrap(function (reason, code)
+	prosody.shutdown_reason = reason;
+	prosody.shutdown_code = code;
+	timer.add_task(pause, prosody.shutdown);
+	coroutine.yield(true, "shutdown initiated");
+	-- Close c2s ports, stop accepting new connections
+	portman.deactivate("c2s");
+	-- Close all c2s sessions
+	for _, sess in pairs(prosody.full_sessions) do
+		sess:close{ condition = "system-shutdown", text = reason }
+	end
+	-- Wait for notifications to be sent
+	coroutine.yield(pause);
+	-- Event for everything else to shut down
+	prosody.events.fire_event("server-stopping", {
+		reason = reason;
+		code = code;
+	});
+	-- And wait
+	coroutine.yield(pause);
+	-- And stop main event loop
+	server.setquitting(true);
+	-- And wait for death
+	coroutine.yield(pause * 3);
+	-- you came back? die zombie!
+	os.exit(1);
+end);