annotate mod_graceful_shutdown/mod_graceful_shutdown.lua @ 4542:fb4a50bf60f1

mod_prometheus: Invoke stats collection if in 'manual' mode Since 10d13e0554f9 a special value for statistics_interval "manual" exists, where a module is expected to invoke processing in connection to collection of stats. This makes internal collection and exporting to Prometheus happens at the same time with no chance of timers getting out of sync.
author Kim Alvefur <zash@zash.se>
date Tue, 13 Apr 2021 23:53:53 +0200
parents 4652a112a4ba
children 8dbaa5e753f3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2170
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 -- luacheck: ignore 122/prosody 113/prosody
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
2
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3 local timer = require "util.timer";
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local portman = require "core.portmanager";
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local server = require "net.server";
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
6
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7 module:set_global();
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local orig_shutdown = prosody.shutdown;
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
9
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10 local pause = module:get_option_number("shutdown_pause", 1);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
12 function module.unload()
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
13 prosody.shutdown = orig_shutdown;
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
14 end
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
15
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 prosody.shutdown = coroutine.wrap(function (reason, code)
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 prosody.shutdown_reason = reason;
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 prosody.shutdown_code = code;
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 timer.add_task(pause, prosody.shutdown);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 coroutine.yield(true, "shutdown initiated");
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 -- Close c2s ports, stop accepting new connections
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22 portman.deactivate("c2s");
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 -- Close all c2s sessions
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
24 for _, sess in pairs(prosody.full_sessions) do
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
25 sess:close{ condition = "system-shutdown", text = reason }
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 end
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
27 -- Wait for notifications to be sent
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
28 coroutine.yield(pause);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 -- Event for everything else to shut down
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 prosody.events.fire_event("server-stopping", {
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 reason = reason;
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
32 code = code;
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
33 });
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
34 -- And wait
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
35 coroutine.yield(pause);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
36 -- And stop main event loop
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
37 server.setquitting(true);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
38 -- And wait for death
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
39 coroutine.yield(pause * 3);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 -- you came back? die zombie!
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 os.exit(1);
4652a112a4ba mod_graceful_shutdown: Experiment in improving the shutdown experience
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42 end);