Fix race in entity_platform.async_add_entities #18445
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Description:
There is a race in
entity_platform.async_add_entities()
which makes the check for duplicated entity_id fail. This in turns may cause several entities to be created with the same entity_id.The issue can very easily be reproduced by publishing persistent MQTT discovery messages with same name before starting hass.
This has previously been reported in #13316 and #15731, although with a slightly different twist
The root cause is described in some detail in #13316
This PR solves the race when there are multiple concurrent calls to
entity_platform.async_add_entities()
from the same platform.Possible further improvement:
entity_platform.async_add_entities()
from different platforms as pointed out by @OttoWinterMaybe this can be fixed by:
entity_platform.async_add_entities()
- dead simple, but might have a negative performance impactreserved_entity_ids
which will hold anentity_id
until the entity has been added tohass.states
entity_id
generated byentity_registry.async_generate_entity_id
to also include platform name, e.g.mqtt_name
instead ofname
in the same way as is already done byhomeassistant.helpers.entity.async_generate_entity_id
Checklist:
tox
. Your PR cannot be merged unless tests pass