Chore: Handle immediate exit of core controller fails to start
authorMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 6 Feb 2025 23:08:48 +0000 (00:08 +0100)
committerMarcel van der Veldt <m.vanderveldt@outlook.com>
Thu, 6 Feb 2025 23:08:48 +0000 (00:08 +0100)
music_assistant/__main__.py
music_assistant/controllers/music.py
music_assistant/helpers/webserver.py

index d3db29cd397ba686e8c51006cc9ceaaf2c1efcf6..a2b2e3e7139209b780fff09f441faeea41f88122 100644 (file)
@@ -210,7 +210,12 @@ def main() -> None:
         if dev_mode or log_level == "DEBUG":
             loop.set_debug(True)
         loop.set_exception_handler(_global_loop_exception_handler)
-        await mass.start()
+        try:
+            await mass.start()
+        except Exception:
+            # exit immediately if startup fails
+            loop.stop()
+            raise
 
     run(
         start_mass(),
index ca4b851cc8f4c6e8396933a5e7d319a8479fb56d..db796e9078683167d8093b76a529f82d6e4c80ef 100644 (file)
@@ -174,7 +174,8 @@ class MusicController(CoreController):
         """Cleanup on exit."""
         if self._sync_task and not self._sync_task.done():
             self._sync_task.cancel()
-        await self.database.close()
+        if self.database:
+            await self.database.close()
 
     @property
     def providers(self) -> list[MusicProvider]:
index 2097bc316a8a5197053946d1a1a06ce1d8a26584..223a68edd05b9b4ad1168b7c6476d8c3afa234e4 100644 (file)
@@ -86,10 +86,13 @@ class Webserver:
     async def close(self) -> None:
         """Cleanup on exit."""
         # stop/clean webserver
-        await self._tcp_site.stop()
-        await self._apprunner.cleanup()
-        await self._webapp.shutdown()
-        await self._webapp.cleanup()
+        if self._tcp_site:
+            await self._tcp_site.stop()
+        if self._apprunner:
+            await self._apprunner.cleanup()
+        if self._webapp:
+            await self._webapp.shutdown()
+            await self._webapp.cleanup()
 
     @property
     def base_url(self):
@@ -128,7 +131,7 @@ class Webserver:
             msg = "Dynamic routes are not enabled"
             raise RuntimeError(msg)
         key = f"{method}.{path}"
-        self._dynamic_routes.pop(key)
+        self._dynamic_routes.pop(key, None)
 
     async def serve_static(self, file_path: str, request: web.Request) -> web.FileResponse:
         """Serve file response."""