From 87ea96a3e0db65029f7eeafb974dc7aa4b63bb5b Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Wed, 26 Nov 2025 16:03:14 +0100 Subject: [PATCH] Save entity registry store in worker thread (#157274) --- homeassistant/helpers/entity_registry.py | 11 ++++++++--- homeassistant/helpers/registry.py | 1 - 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index 3b0cb67f6a2..a6b26af4e02 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -824,6 +824,7 @@ class EntityRegistry(BaseRegistry): STORAGE_KEY, atomic_writes=True, minor_version=STORAGE_VERSION_MINOR, + serialize_in_event_loop=False, ) self.hass.bus.async_listen( EVENT_DEVICE_REGISTRY_UPDATED, @@ -1630,13 +1631,17 @@ class EntityRegistry(BaseRegistry): self.entities = entities self._entities_data = entities.data - @callback def _data_to_save(self) -> dict[str, Any]: """Return data of entity registry to store in a file.""" + # Create intermediate lists to allow this method to be called from a thread + # other than the event loop. return { - "entities": [entry.as_storage_fragment for entry in self.entities.values()], + "entities": [ + entry.as_storage_fragment for entry in list(self.entities.values()) + ], "deleted_entities": [ - entry.as_storage_fragment for entry in self.deleted_entities.values() + entry.as_storage_fragment + for entry in list(self.deleted_entities.values()) ], } diff --git a/homeassistant/helpers/registry.py b/homeassistant/helpers/registry.py index 21f2178554e..6c5fd117140 100644 --- a/homeassistant/helpers/registry.py +++ b/homeassistant/helpers/registry.py @@ -77,7 +77,6 @@ class BaseRegistry[_StoreDataT: Mapping[str, Any] | Sequence[Any]](ABC): delay = SAVE_DELAY if self.hass.state is CoreState.running else SAVE_DELAY_LONG self._store.async_delay_save(self._data_to_save, delay) - @callback @abstractmethod def _data_to_save(self) -> _StoreDataT: """Return data of registry to store in a file."""