Small performance improvements to config entry setup retry (#110448)

* Small performance improvements to config entry setup retry

- cache some properties that never change
- avoid loader.async_get_integration when we already have it
- avoid multiple integration.domain checks

* tweaks
This commit is contained in:
J. Nick Koston 2024-02-13 06:28:52 -06:00 committed by GitHub
parent 6812596cd7
commit 01c3205635
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 17 additions and 17 deletions

View file

@ -385,12 +385,12 @@ class ConfigEntry:
if self.source == SOURCE_IGNORE or self.disabled_by: if self.source == SOURCE_IGNORE or self.disabled_by:
return return
if integration is None: if integration is None and not (integration := self._integration_for_domain):
integration = await loader.async_get_integration(hass, self.domain) integration = await loader.async_get_integration(hass, self.domain)
self._integration_for_domain = integration self._integration_for_domain = integration
# Only store setup result as state if it was not forwarded. # Only store setup result as state if it was not forwarded.
if self.domain == integration.domain: if domain_is_integration := self.domain == integration.domain:
self._async_set_state(hass, ConfigEntryState.SETUP_IN_PROGRESS, None) self._async_set_state(hass, ConfigEntryState.SETUP_IN_PROGRESS, None)
if self.supports_unload is None: if self.supports_unload is None:
@ -409,13 +409,13 @@ class ConfigEntry:
self.domain, self.domain,
err, err,
) )
if self.domain == integration.domain: if domain_is_integration:
self._async_set_state( self._async_set_state(
hass, ConfigEntryState.SETUP_ERROR, "Import error" hass, ConfigEntryState.SETUP_ERROR, "Import error"
) )
return return
if self.domain == integration.domain: if domain_is_integration:
try: try:
integration.get_platform("config_flow") integration.get_platform("config_flow")
except ImportError as err: except ImportError as err:
@ -475,12 +475,12 @@ class ConfigEntry:
self.async_start_reauth(hass) self.async_start_reauth(hass)
result = False result = False
except ConfigEntryNotReady as exc: except ConfigEntryNotReady as exc:
self._async_set_state(hass, ConfigEntryState.SETUP_RETRY, str(exc) or None) message = str(exc)
self._async_set_state(hass, ConfigEntryState.SETUP_RETRY, message or None)
wait_time = 2 ** min(self._tries, 4) * 5 + ( wait_time = 2 ** min(self._tries, 4) * 5 + (
randint(RANDOM_MICROSECOND_MIN, RANDOM_MICROSECOND_MAX) / 1000000 randint(RANDOM_MICROSECOND_MIN, RANDOM_MICROSECOND_MAX) / 1000000
) )
self._tries += 1 self._tries += 1
message = str(exc)
ready_message = f"ready yet: {message}" if message else "ready yet" ready_message = f"ready yet: {message}" if message else "ready yet"
_LOGGER.debug( _LOGGER.debug(
( (
@ -513,7 +513,7 @@ class ConfigEntry:
result = False result = False
# Only store setup result as state if it was not forwarded. # Only store setup result as state if it was not forwarded.
if self.domain != integration.domain: if not domain_is_integration:
return return
# #

View file

@ -665,52 +665,52 @@ class Integration:
"""Return reason integration is disabled.""" """Return reason integration is disabled."""
return self.manifest.get("disabled") return self.manifest.get("disabled")
@property @cached_property
def domain(self) -> str: def domain(self) -> str:
"""Return domain.""" """Return domain."""
return self.manifest["domain"] return self.manifest["domain"]
@property @cached_property
def dependencies(self) -> list[str]: def dependencies(self) -> list[str]:
"""Return dependencies.""" """Return dependencies."""
return self.manifest.get("dependencies", []) return self.manifest.get("dependencies", [])
@property @cached_property
def after_dependencies(self) -> list[str]: def after_dependencies(self) -> list[str]:
"""Return after_dependencies.""" """Return after_dependencies."""
return self.manifest.get("after_dependencies", []) return self.manifest.get("after_dependencies", [])
@property @cached_property
def requirements(self) -> list[str]: def requirements(self) -> list[str]:
"""Return requirements.""" """Return requirements."""
return self.manifest.get("requirements", []) return self.manifest.get("requirements", [])
@property @cached_property
def config_flow(self) -> bool: def config_flow(self) -> bool:
"""Return config_flow.""" """Return config_flow."""
return self.manifest.get("config_flow") or False return self.manifest.get("config_flow") or False
@property @cached_property
def documentation(self) -> str | None: def documentation(self) -> str | None:
"""Return documentation.""" """Return documentation."""
return self.manifest.get("documentation") return self.manifest.get("documentation")
@property @cached_property
def issue_tracker(self) -> str | None: def issue_tracker(self) -> str | None:
"""Return issue tracker link.""" """Return issue tracker link."""
return self.manifest.get("issue_tracker") return self.manifest.get("issue_tracker")
@property @cached_property
def loggers(self) -> list[str] | None: def loggers(self) -> list[str] | None:
"""Return list of loggers used by the integration.""" """Return list of loggers used by the integration."""
return self.manifest.get("loggers") return self.manifest.get("loggers")
@property @cached_property
def quality_scale(self) -> str | None: def quality_scale(self) -> str | None:
"""Return Integration Quality Scale.""" """Return Integration Quality Scale."""
return self.manifest.get("quality_scale") return self.manifest.get("quality_scale")
@property @cached_property
def iot_class(self) -> str | None: def iot_class(self) -> str | None:
"""Return the integration IoT Class.""" """Return the integration IoT Class."""
return self.manifest.get("iot_class") return self.manifest.get("iot_class")