annotate mod_s2s_keepalive/mod_s2s_keepalive.lua @ 3866:c0df50ce96f0

mod_rest: Handle internal http request errors early and then return Skips over attempted parsing of the payload which usually failed since the body is an error string like "connection refused", so this produced useless errors.
author Kim Alvefur <zash@zash.se>
date Sat, 25 Jan 2020 20:22:12 +0100
parents 580862decd77
children c4002aae4ad3
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
1 local st = require "util.stanza";
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
2 local watchdog = require "util.watchdog";
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
3
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
4 local keepalive_servers = module:get_option_set("keepalive_servers");
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
5 local keepalive_interval = module:get_option_number("keepalive_interval", 60);
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
6 local keepalive_timeout = module:get_option_number("keepalive_timeout", 593);
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
7
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
8 local host = module.host;
3764
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
9 local s2sout = prosody.hosts[host].s2sout;
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
10
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
11 local function send_pings()
3764
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
12 local ping_hosts = {};
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
13
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
14 for remote_domain, session in pairs(s2sout) do
3771
98e1e3ce307d mod_s2s_keepalive: Invert check to work with bidi connections
Kim Alvefur <zash@zash.se>
parents: 3770
diff changeset
15 if session.type ~= "s2sout_unauthed"
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
16 and (not(keepalive_servers) or keepalive_servers:contains(remote_domain)) then
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
17 session.sends2s(st.iq({ to = remote_domain, type = "get", from = host, id = "keepalive" })
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
18 :tag("ping", { xmlns = "urn:xmpp:ping" })
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
19 );
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
20 end
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
21 end
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
22
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
23 for session in pairs(prosody.incoming_s2s) do
3771
98e1e3ce307d mod_s2s_keepalive: Invert check to work with bidi connections
Kim Alvefur <zash@zash.se>
parents: 3770
diff changeset
24 if session.type ~= "s2sin_unauthed"
3772
22f02716819f mod_s2s_keepalive: Isolate source host of pings
Kim Alvefur <zash@zash.se>
parents: 3771
diff changeset
25 and session.to_host == host
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
26 and (not(keepalive_servers) or keepalive_servers:contains(session.from_host)) then
3764
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
27 if not s2sout[session.from_host] then ping_hosts[session.from_host] = true; end
1264
2db2c03dfb95 mod_s2s_keepalive: Don't send directly on the connection, use sends2s
Kim Alvefur <zash@zash.se>
parents: 1110
diff changeset
28 session.sends2s " ";
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
29 -- If the connection is dead, this should make it time out.
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
30 end
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
31 end
3764
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
32
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
33 -- ping remotes we only have s2sin from
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
34 for remote_domain in pairs(ping_hosts) do
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
35 module:send(st.iq({ to = remote_domain, type = "get", from = host, id = "keepalive" })
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
36 :tag("ping", { xmlns = "urn:xmpp:ping" })
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
37 );
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
38 end
07a1faa24261 mod_s2s_keepalive: Ping remotes we only have s2sin established from
Kim Alvefur <zash@zash.se>
parents: 3723
diff changeset
39
1110
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
40 return keepalive_interval;
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
41 end
97e238ce37ce mod_s2s_keepalive: Initial commit, poke s2s connections with pings and whitespace
Kim Alvefur <zash@zash.se>
parents:
diff changeset
42
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
43 module:hook("s2sin-established", function (event)
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
44 local session = event.session;
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
45 if session.watchdog_keepalive then return end -- in case mod_bidi fires this twice
3833
580862decd77 mod_s2s_keepalive: Respect keepalive_servers when creating watchdogs
Kim Alvefur <zash@zash.se>
parents: 3772
diff changeset
46 if keepalive_servers and not keepalive_servers:contains(session.from_host) then return end
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
47 session.watchdog_keepalive = watchdog.new(keepalive_timeout, function ()
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
48 session.log("info", "Keepalive ping timed out, closing connection");
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
49 session:close("connection-timeout");
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
50 end);
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
51 end);
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
52
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
53 module:hook("s2sout-established", function (event)
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
54 local session = event.session;
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
55 if session.watchdog_keepalive then return end -- in case mod_bidi fires this twice
3833
580862decd77 mod_s2s_keepalive: Respect keepalive_servers when creating watchdogs
Kim Alvefur <zash@zash.se>
parents: 3772
diff changeset
56 if keepalive_servers and not keepalive_servers:contains(session.from_host) then return end
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
57 session.watchdog_keepalive = watchdog.new(keepalive_timeout, function ()
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
58 session.log("info", "Keepalive ping timed out, closing connection");
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
59 session:close("connection-timeout");
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
60 end);
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
61 end);
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
62
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
63 module:hook("iq-result/host/keepalive", function (event)
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
64 local origin = event.origin;
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
65 if origin.watchdog_keepalive then
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
66 origin.watchdog_keepalive:reset();
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
67 end
3766
f547eafb5a6d mod_s2s_keepalive: Fix s2sout watchdog reset
Kim Alvefur <zash@zash.se>
parents: 3765
diff changeset
68 if s2sout[origin.from_host] and s2sout[origin.from_host].watchdog_keepalive then
f547eafb5a6d mod_s2s_keepalive: Fix s2sout watchdog reset
Kim Alvefur <zash@zash.se>
parents: 3765
diff changeset
69 s2sout[origin.from_host].watchdog_keepalive:reset();
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
70 end
3770
ae34ee0867f0 mod_s2s_keepalive: Mark ping response event as handled
Kim Alvefur <zash@zash.se>
parents: 3769
diff changeset
71 return true;
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
72 end);
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
73
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
74 module:hook("iq-error/host/keepalive", function (event)
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
75 local origin = event.origin;
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
76 if origin.dummy then return end -- Probably a sendq bounce
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
77
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
78 if origin.type == "s2sin" or origin.type == "s2sout" then
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
79 -- An error from the remote means connectivity is ok,
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
80 -- so treat it the same as a result
3769
ce1a32aa8bca mod_s2s_keepalive: Include event payload in re-fired event (fix traceback)
Kim Alvefur <zash@zash.se>
parents: 3766
diff changeset
81 return module:fire_event("iq-result/host/keepalive", event);
3765
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
82 end
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
83 end);
11878130f266 mod_s2s_keepalive: Use a watchdog to close unresponsive sessions (fixes #1457)
Kim Alvefur <zash@zash.se>
parents: 3764
diff changeset
84
3723
427879b46061 mod_s2s_keepalive: Remove support for obsolete Prosody 0.8
Kim Alvefur <zash@zash.se>
parents: 1264
diff changeset
85 module:add_timer(keepalive_interval, send_pings);