Refactor MQTT discovery to avoid creating closure if hash already in discovery_pending_discovered (#99458)

This commit is contained in:
J. Nick Koston 2023-09-01 16:40:53 -04:00 committed by GitHub
parent 04bf126425
commit 5a8fc43212
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

View File

@ -275,32 +275,34 @@ async def async_start( # noqa: C901
_LOGGER.debug("Process discovery payload %s", payload)
discovery_hash = (component, discovery_id)
if discovery_hash in mqtt_data.discovery_already_discovered or payload:
already_discovered = discovery_hash in mqtt_data.discovery_already_discovered
if (
already_discovered or payload
) and discovery_hash not in mqtt_data.discovery_pending_discovered:
discovery_pending_discovered = mqtt_data.discovery_pending_discovered
@callback
def discovery_done(_: Any) -> None:
pending = mqtt_data.discovery_pending_discovered[discovery_hash][
"pending"
]
pending = discovery_pending_discovered[discovery_hash]["pending"]
_LOGGER.debug("Pending discovery for %s: %s", discovery_hash, pending)
if not pending:
mqtt_data.discovery_pending_discovered[discovery_hash]["unsub"]()
mqtt_data.discovery_pending_discovered.pop(discovery_hash)
discovery_pending_discovered[discovery_hash]["unsub"]()
discovery_pending_discovered.pop(discovery_hash)
else:
payload = pending.pop()
async_process_discovery_payload(component, discovery_id, payload)
if discovery_hash not in mqtt_data.discovery_pending_discovered:
mqtt_data.discovery_pending_discovered[discovery_hash] = {
"unsub": async_dispatcher_connect(
hass,
MQTT_DISCOVERY_DONE.format(discovery_hash),
discovery_done,
),
"pending": deque([]),
}
discovery_pending_discovered[discovery_hash] = {
"unsub": async_dispatcher_connect(
hass,
MQTT_DISCOVERY_DONE.format(discovery_hash),
discovery_done,
),
"pending": deque([]),
}
if discovery_hash in mqtt_data.discovery_already_discovered:
if already_discovered:
# Dispatch update
message = f"Component has already been discovered: {component} {discovery_id}, sending update"
async_log_discovery_origin_info(message, payload)