diff --git a/bumper/__init__.py b/bumper/__init__.py index afdc0be..f590e68 100644 --- a/bumper/__init__.py +++ b/bumper/__init__.py @@ -140,6 +140,8 @@ async def maintenance(): async def shutdown(): try: bumperlog.info("Shutting down") + global shutting_down + shutting_down = True await mqtt_helperbot.disconnect() await web_server.shutdown() @@ -151,18 +153,11 @@ async def shutdown(): if xmpp_server.server._serving: xmpp_server.server.close() await xmpp_server.server.wait_closed() - global shutting_down - shutting_down = True + bumperlog.info("Shutdown complete") except asyncio.CancelledError: bumperlog.info("Coroutine canceled") - except Exception as e: - bumperlog.info(f"Exception: {e}") - - finally: - bumperlog.info("Shutdown complete") - def main(argv=None): import argparse diff --git a/bumper/mqtt/server.py b/bumper/mqtt/server.py index bd560d6..3e88255 100644 --- a/bumper/mqtt/server.py +++ b/bumper/mqtt/server.py @@ -105,6 +105,12 @@ class MQTTServer: async def shutdown(self) -> None: """Shutdown server.""" + # stop session handler manually otherwise connection will not be closed correctly + for ( + _, + handler, + ) in self._broker._sessions.values(): # pylint: disable=protected-access + await handler.stop() await self._broker.shutdown() diff --git a/bumper/web/server.py b/bumper/web/server.py index fe6aa68..e318416 100644 --- a/bumper/web/server.py +++ b/bumper/web/server.py @@ -243,20 +243,10 @@ class WebServer: asyncio.create_task(bumper.mqtt_helperbot.start()) async def _restart_mqtt_server(self) -> None: - loop = asyncio.get_event_loop() - if bumper.mqtt_server.state not in ["stopped", "not_started"]: - # close session writers - this was required so bots would reconnect properly after restarting - for sess in list(bumper.mqtt_server.broker._sessions): - sessobj = bumper.mqtt_server.broker._sessions[sess][1] - if sessobj.session.transitions.state == "connected": - await sessobj.writer.close() + await bumper.mqtt_server.shutdown() - loop.call_later( - 0.1, lambda: asyncio.create_task(bumper.mqtt_server.shutdown()) - ) - - loop.call_later(1.5, lambda: asyncio.create_task(bumper.mqtt_server.start())) + asyncio.create_task(bumper.mqtt_server.start()) async def _handle_restart_service(self, request: Request) -> Response: try: diff --git a/tests/test_mqttserver.py b/tests/test_mqttserver.py index 812f73b..7133d42 100644 --- a/tests/test_mqttserver.py +++ b/tests/test_mqttserver.py @@ -354,13 +354,14 @@ async def test_nofileauth_mqttserver(): mqtt_server = MQTTServer(HOST, MQTT_PORT, password_file="tests/passwd-notfound") await mqtt_server.start() - await mqtt_server.shutdown() - - l.check_present( - ( - "amqtt.broker.plugins.bumper", - "WARNING", - "Password file tests/passwd-notfound not found", - ), - order_matters=False, - ) + try: + l.check_present( + ( + "amqtt.broker.plugins.bumper", + "WARNING", + "Password file tests/passwd-notfound not found", + ), + order_matters=False, + ) + finally: + await mqtt_server.shutdown()