mirror of
https://github.com/home-assistant/core.git
synced 2025-04-23 16:57:53 +00:00
Improve handling of empty iterable in async_add_entities (#141889)
* Improve handling of empty iterable in async_add_entities We had two checks here because we were doing an empty iterable check. If its a list we can check it directly but if its not we need to convert it to a list to know if its empty. * tweaks * tasks never used
This commit is contained in:
parent
704d7a037c
commit
018651ff1d
@ -573,9 +573,9 @@ class EntityPlatform:
|
||||
|
||||
async def _async_add_and_update_entities(
|
||||
self,
|
||||
coros: list[Coroutine[Any, Any, None]],
|
||||
entities: list[Entity],
|
||||
timeout: float,
|
||||
config_subentry_id: str | None,
|
||||
) -> None:
|
||||
"""Add entities for a single platform and update them.
|
||||
|
||||
@ -585,10 +585,21 @@ class EntityPlatform:
|
||||
event loop and will finish faster if we run them concurrently.
|
||||
"""
|
||||
results: list[BaseException | None] | None = None
|
||||
tasks = [create_eager_task(coro, loop=self.hass.loop) for coro in coros]
|
||||
entity_registry = ent_reg.async_get(self.hass)
|
||||
try:
|
||||
async with self.hass.timeout.async_timeout(timeout, self.domain):
|
||||
results = await asyncio.gather(*tasks, return_exceptions=True)
|
||||
results = await asyncio.gather(
|
||||
*(
|
||||
create_eager_task(
|
||||
self._async_add_entity(
|
||||
entity, True, entity_registry, config_subentry_id
|
||||
),
|
||||
loop=self.hass.loop,
|
||||
)
|
||||
for entity in entities
|
||||
),
|
||||
return_exceptions=True,
|
||||
)
|
||||
except TimeoutError:
|
||||
self.logger.warning(
|
||||
"Timed out adding entities for domain %s with platform %s after %ds",
|
||||
@ -615,9 +626,9 @@ class EntityPlatform:
|
||||
|
||||
async def _async_add_entities(
|
||||
self,
|
||||
coros: list[Coroutine[Any, Any, None]],
|
||||
entities: list[Entity],
|
||||
timeout: float,
|
||||
config_subentry_id: str | None,
|
||||
) -> None:
|
||||
"""Add entities for a single platform without updating.
|
||||
|
||||
@ -626,13 +637,15 @@ class EntityPlatform:
|
||||
to the event loop so we can await the coros directly without
|
||||
scheduling them as tasks.
|
||||
"""
|
||||
entity_registry = ent_reg.async_get(self.hass)
|
||||
try:
|
||||
async with self.hass.timeout.async_timeout(timeout, self.domain):
|
||||
for idx, coro in enumerate(coros):
|
||||
for entity in entities:
|
||||
try:
|
||||
await coro
|
||||
await self._async_add_entity(
|
||||
entity, False, entity_registry, config_subentry_id
|
||||
)
|
||||
except Exception as ex:
|
||||
entity = entities[idx]
|
||||
self.logger.exception(
|
||||
"Error adding entity %s for domain %s with platform %s",
|
||||
entity.entity_id,
|
||||
@ -670,33 +683,20 @@ class EntityPlatform:
|
||||
f"entry {self.config_entry.entry_id if self.config_entry else None}"
|
||||
)
|
||||
|
||||
entities: list[Entity] = (
|
||||
new_entities if type(new_entities) is list else list(new_entities)
|
||||
)
|
||||
# handle empty list from component/platform
|
||||
if not new_entities: # type: ignore[truthy-iterable]
|
||||
if not entities:
|
||||
return
|
||||
|
||||
hass = self.hass
|
||||
entity_registry = ent_reg.async_get(hass)
|
||||
coros: list[Coroutine[Any, Any, None]] = []
|
||||
entities: list[Entity] = []
|
||||
for entity in new_entities:
|
||||
coros.append(
|
||||
self._async_add_entity(
|
||||
entity, update_before_add, entity_registry, config_subentry_id
|
||||
)
|
||||
)
|
||||
entities.append(entity)
|
||||
|
||||
# No entities for processing
|
||||
if not coros:
|
||||
return
|
||||
|
||||
timeout = max(SLOW_ADD_ENTITY_MAX_WAIT * len(coros), SLOW_ADD_MIN_TIMEOUT)
|
||||
timeout = max(SLOW_ADD_ENTITY_MAX_WAIT * len(entities), SLOW_ADD_MIN_TIMEOUT)
|
||||
if update_before_add:
|
||||
add_func = self._async_add_and_update_entities
|
||||
await self._async_add_and_update_entities(
|
||||
entities, timeout, config_subentry_id
|
||||
)
|
||||
else:
|
||||
add_func = self._async_add_entities
|
||||
|
||||
await add_func(coros, entities, timeout)
|
||||
await self._async_add_entities(entities, timeout, config_subentry_id)
|
||||
|
||||
if (
|
||||
(self.config_entry and self.config_entry.pref_disable_polling)
|
||||
|
Loading…
x
Reference in New Issue
Block a user