Automatically repair configs broken by the last_error retry glitch (#1443)
authorJc2k <john.carr@unrouted.co.uk>
Thu, 4 Jul 2024 11:14:28 +0000 (12:14 +0100)
committerGitHub <noreply@github.com>
Thu, 4 Jul 2024 11:14:28 +0000 (13:14 +0200)
music_assistant/server/controllers/config.py

index 99a59999108c8c48ab73419ee75e49015a121118..e2d1e86f92000e301507a88888d14b813aeae294 100644 (file)
@@ -694,6 +694,7 @@ class ConfigController:
                 async with aiofiles.open(filename, "r", encoding="utf-8") as _file:
                     self._data = json_loads(await _file.read())
                     LOGGER.debug("Loaded persistent settings from %s", filename)
+                    await self._migrate()
                     return
             except FileNotFoundError:
                 pass
@@ -701,6 +702,20 @@ class ConfigController:
                 LOGGER.exception("Error while reading persistent storage file %s", filename)
         LOGGER.debug("Started with empty storage: No persistent storage file found.")
 
+    async def _migrate(self) -> None:
+        changed = False
+
+        # Older versions of MA can create corrupt entries with no domain if retrying
+        # logic runs after a provider has been removed. Remove those corrupt entries.
+        for instance_id, provider_config in list(self._data.get(CONF_PROVIDERS, {}).items()):
+            if "domain" not in provider_config:
+                self._data[CONF_PROVIDERS].pop(instance_id, None)
+                LOGGER.warning("Removed corrupt provider configuration: %s", instance_id)
+                changed = True
+
+        if changed:
+            await self._async_save()
+
     async def _async_save(self) -> None:
         """Save persistent data to disk."""
         filename_backup = f"{self.filename}.backup"