Revert "Add a timeout for async_add_entities (#38474)" (#38584)

This reverts commit 7590af3930.
pull/38718/head
Pascal Vizeli 2020-08-06 09:32:42 +02:00 committed by GitHub
parent 9d9426f24c
commit 896bdbff8f
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 3 additions and 61 deletions

View File

@ -1,6 +1,5 @@
"""Class to manage the entities for a single platform."""
import asyncio
from contextlib import suppress
from contextvars import ContextVar
from datetime import datetime, timedelta
from logging import Logger
@ -24,8 +23,6 @@ if TYPE_CHECKING:
SLOW_SETUP_WARNING = 10
SLOW_SETUP_MAX_WAIT = 60
SLOW_ADD_ENTITIES_MAX_WAIT = 60
PLATFORM_NOT_READY_RETRIES = 10
DATA_ENTITY_PLATFORM = "entity_platform"
PLATFORM_NOT_READY_BASE_WAIT_TIME = 30 # seconds
@ -285,10 +282,8 @@ class EntityPlatform:
device_registry = await hass.helpers.device_registry.async_get_registry()
entity_registry = await hass.helpers.entity_registry.async_get_registry()
tasks = [
asyncio.create_task(
self._async_add_entity( # type: ignore
entity, update_before_add, entity_registry, device_registry
)
self._async_add_entity( # type: ignore
entity, update_before_add, entity_registry, device_registry
)
for entity in new_entities
]
@ -297,24 +292,7 @@ class EntityPlatform:
if not tasks:
return
await asyncio.wait(tasks, timeout=SLOW_ADD_ENTITIES_MAX_WAIT)
for idx, entity in enumerate(new_entities):
task = tasks[idx]
if task.done():
await task
continue
self.logger.warning(
"Timed out adding entity %s for domain %s with platform %s after %ds.",
entity.entity_id,
self.domain,
self.platform_name,
SLOW_ADD_ENTITIES_MAX_WAIT,
)
task.cancel()
with suppress(asyncio.CancelledError):
await task
await asyncio.gather(*tasks)
if self._async_unsub_polling is not None or not any(
entity.should_poll for entity in self.entities.values()

View File

@ -931,39 +931,3 @@ async def test_invalid_entity_id(hass):
await platform.async_add_entities([entity])
assert entity.hass is None
assert entity.platform is None
class MockBlockingEntity(MockEntity):
"""Class to mock an entity that will block adding entities."""
async def async_added_to_hass(self):
"""Block for a long time."""
await asyncio.sleep(1000)
async def test_setup_entry_with_entities_that_block_forever(hass, caplog):
"""Test we cancel adding entities when we reach the timeout."""
registry = mock_registry(hass)
async def async_setup_entry(hass, config_entry, async_add_entities):
"""Mock setup entry method."""
async_add_entities([MockBlockingEntity(name="test1", unique_id="unique")])
return True
platform = MockPlatform(async_setup_entry=async_setup_entry)
config_entry = MockConfigEntry(entry_id="super-mock-id")
mock_entity_platform = MockEntityPlatform(
hass, platform_name=config_entry.domain, platform=platform
)
with patch.object(entity_platform, "SLOW_ADD_ENTITIES_MAX_WAIT", 0.01):
assert await mock_entity_platform.async_setup_entry(config_entry)
await hass.async_block_till_done()
full_name = f"{mock_entity_platform.domain}.{config_entry.domain}"
assert full_name in hass.config.components
assert len(hass.states.async_entity_ids()) == 0
assert len(registry.entities) == 1
assert "Timed out adding entity" in caplog.text
assert "test_domain.test1" in caplog.text
assert "test_domain" in caplog.text
assert "test" in caplog.text