Diff

plugins/mod_s2s.lua @ 12301:4f1fe6eb1ddb

mod_c2s,mod_s2s: Wait for sessions to close before proceeding with shutdown steps Ensures unavailable presence and other outgoing stanzas are sent. Waiting for c2s sessions to close first before proceeding to disable and close s2s ensures that unavailable presence can go out, even if it requires dialback to complete first.
author Kim Alvefur <zash@zash.se>
date Thu, 17 Feb 2022 03:49:47 +0100
parent 12299:ff36ac5c7d2b
child 12309:926a6c5d13e7
child 12330:38b5b05407be
line wrap: on
line diff
--- a/plugins/mod_s2s.lua	Fri Feb 18 14:25:22 2022 +0100
+++ b/plugins/mod_s2s.lua	Thu Feb 17 03:49:47 2022 +0100
@@ -26,7 +26,8 @@
 local s2s_new_outgoing = require "core.s2smanager".new_outgoing;
 local s2s_destroy_session = require "core.s2smanager".destroy_session;
 local uuid_gen = require "util.uuid".generate;
-local runner = require "util.async".runner;
+local async = require "util.async";
+local runner = async.runner;
 local connect = require "net.connect".connect;
 local service = require "net.resolvers.service";
 local resolver_chain = require "net.resolvers.chain";
@@ -859,6 +860,7 @@
 		end
 		s2s_destroy_session(session, err);
 	end
+	module:fire_event("s2s-closed", { session = session; conn = conn });
 end
 
 function listener.onfail(data, err)
@@ -971,11 +973,24 @@
 		end
 	end
 
+	local wait, done = async.waiter();
+	module:hook("s2s-closed", function ()
+		if next(sessions) == nil then done(); end
+	end, 1)
+
 	-- Close sessions
 	local reason = event.reason;
 	for _, session in pairs(sessions) do
 		session:close{ condition = "system-shutdown", text = reason };
 	end
+
+	-- Wait for them to close properly if they haven't already
+	if next(sessions) ~= nil then
+		module:log("info", "Waiting for sessions to close");
+		add_task(stream_close_timeout + 1, done);
+		wait();
+	end
+
 end, -200);