Don't overwrite a Thread preference chosen during discovery - #179098
Merged
frenck merged 1 commit intoAug 25, 2026
Conversation
Contributor
|
Hey there @home-assistant/core, mind taking a look at this pull request as it has been labeled with an integration ( Code owner commandsCode owners of
|
Contributor
There was a problem hiding this comment.
Pull request overview
Prevents Thread discovery from overwriting a newer preferred dataset selection.
Changes:
- Preserves preferences selected during discovery.
- Safely skips datasets deleted during discovery.
- Adds regression coverage for preference preservation.
Reviewed changes
Copilot reviewed 2 out of 2 changed files in this pull request and generated 1 comment.
| File | Description |
|---|---|
homeassistant/components/thread/dataset_store.py |
Adds stale-discovery safeguards. |
tests/components/thread/test_dataset_store.py |
Tests preference preservation. |
💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.
Adding the first dataset for a border router starts _set_preferred_dataset_if_only_network(), which waits up to BORDER_AGENT_DISCOVERY_TIMEOUT for more routers to appear, then sets the preference unconditionally. A preference chosen during that window -- a router migrated to another network, a selection in the Thread panel -- gets replaced by the stale result of a task that only ran because no preference existed when it started. Keep an existing preference, and skip a dataset that was deleted during the wait rather than raise KeyError from the preferred_dataset setter.
LorbusChris
force-pushed
the
thread-preferred-dataset-race
branch
from
August 13, 2026 21:45
b65789a to
b75127b
Compare
21 tasks
21 tasks
frenck
approved these changes
Aug 25, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to subscribe to this conversation on GitHub.
Already have an account?
Sign in.
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.
Proposed change
Adding the first dataset for a border router starts
_set_preferred_dataset_if_only_network, which waits up toBORDER_AGENT_DISCOVERY_TIMEOUTfor more border routers to appear, then sets thepreference unconditionally. A preference chosen during that window -- a border router
migrated to another network, a selection in the Thread panel -- gets replaced by the
stale result of a task that only ran because no preference existed when it started.
Everything that shares Thread credentials starts from the preferred dataset, so this
leaves Home Assistant handing out credentials for a network nothing is on.
This change keeps an existing preference, and skips a dataset that was deleted during
the wait rather than raising
KeyErrorfrom the preferred-dataset setter.The regression test fails on
devand passes with the change.Type of change
Additional information
Checklist
ruff format homeassistant tests)If user exposed functionality or configuration variables are added/changed:
If the code communicates with devices, web services, or third-party tools:
Updated and included derived files by running:
python3 -m script.hassfest.requirements_all.txt.Updated by running
python3 -m script.gen_requirements_all.To help with the load of incoming pull requests: