fix shutdown mqtt server correctly

This commit is contained in:
Robert Resch 2022-05-18 01:39:36 +02:00
parent 24359aeda8
commit 6b2a6549f2
4 changed files with 22 additions and 30 deletions

View file

@ -140,6 +140,8 @@ async def maintenance():
async def shutdown(): async def shutdown():
try: try:
bumperlog.info("Shutting down") bumperlog.info("Shutting down")
global shutting_down
shutting_down = True
await mqtt_helperbot.disconnect() await mqtt_helperbot.disconnect()
await web_server.shutdown() await web_server.shutdown()
@ -151,18 +153,11 @@ async def shutdown():
if xmpp_server.server._serving: if xmpp_server.server._serving:
xmpp_server.server.close() xmpp_server.server.close()
await xmpp_server.server.wait_closed() await xmpp_server.server.wait_closed()
global shutting_down
shutting_down = True
bumperlog.info("Shutdown complete")
except asyncio.CancelledError: except asyncio.CancelledError:
bumperlog.info("Coroutine canceled") bumperlog.info("Coroutine canceled")
except Exception as e:
bumperlog.info(f"Exception: {e}")
finally:
bumperlog.info("Shutdown complete")
def main(argv=None): def main(argv=None):
import argparse import argparse

View file

@ -105,6 +105,12 @@ class MQTTServer:
async def shutdown(self) -> None: async def shutdown(self) -> None:
"""Shutdown server.""" """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() await self._broker.shutdown()

View file

@ -243,20 +243,10 @@ class WebServer:
asyncio.create_task(bumper.mqtt_helperbot.start()) asyncio.create_task(bumper.mqtt_helperbot.start())
async def _restart_mqtt_server(self) -> None: async def _restart_mqtt_server(self) -> None:
loop = asyncio.get_event_loop()
if bumper.mqtt_server.state not in ["stopped", "not_started"]: if bumper.mqtt_server.state not in ["stopped", "not_started"]:
# close session writers - this was required so bots would reconnect properly after restarting await bumper.mqtt_server.shutdown()
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()
loop.call_later( asyncio.create_task(bumper.mqtt_server.start())
0.1, lambda: asyncio.create_task(bumper.mqtt_server.shutdown())
)
loop.call_later(1.5, lambda: asyncio.create_task(bumper.mqtt_server.start()))
async def _handle_restart_service(self, request: Request) -> Response: async def _handle_restart_service(self, request: Request) -> Response:
try: try:

View file

@ -354,8 +354,7 @@ async def test_nofileauth_mqttserver():
mqtt_server = MQTTServer(HOST, MQTT_PORT, password_file="tests/passwd-notfound") mqtt_server = MQTTServer(HOST, MQTT_PORT, password_file="tests/passwd-notfound")
await mqtt_server.start() await mqtt_server.start()
await mqtt_server.shutdown() try:
l.check_present( l.check_present(
( (
"amqtt.broker.plugins.bumper", "amqtt.broker.plugins.bumper",
@ -364,3 +363,5 @@ async def test_nofileauth_mqttserver():
), ),
order_matters=False, order_matters=False,
) )
finally:
await mqtt_server.shutdown()