mirror of
https://github.com/XiaoMi/ha_xiaomi_home.git
synced 2026-10-27 16:10:49 +08:00
fix: drain stale futures in __get_prop_handler on batch failure (#1723)
When get_props_async raises (cloud timeout, network error, etc.) the pending futures registered in self._get_prop_list stay unresolved forever. Subsequent get_prop_async calls with the same (did, siid, piid) key reuse the dead future via the cache lookup at the top of get_prop_async, so the integration never recovers from a single batch failure until Home Assistant is restarted. This was reproducible whenever the cloud HTTP request hung past the caller's wait_for timeout: every later poll for that key returned the same cancelled-but-still-pending future. Property entities driven by async_update silently stopped updating with no error in the logs. Wrap the await in try/except and fall through with results=[]. The existing fallback loop then drains every key still in props_req with set_result(None), unblocking awaiters and freeing the cache slot so the next aggregation cycle starts fresh.
This commit is contained in:
@@ -755,7 +755,18 @@ class MIoTHttpClient:
|
|||||||
if not props_buffer:
|
if not props_buffer:
|
||||||
_LOGGER.error('get prop error, empty request list')
|
_LOGGER.error('get prop error, empty request list')
|
||||||
return False
|
return False
|
||||||
results = await self.get_props_async(props_buffer)
|
try:
|
||||||
|
results = await self.get_props_async(props_buffer)
|
||||||
|
except Exception as err: # pylint: disable=broad-exception-caught
|
||||||
|
# If the batch request fails (timeout, network error, etc.), the
|
||||||
|
# pending futures in self._get_prop_list would otherwise stay
|
||||||
|
# unresolved forever. Subsequent get_prop_async calls with the
|
||||||
|
# same key reuse the dead future via the cache lookup at the top
|
||||||
|
# of get_prop_async, so the integration would never recover until
|
||||||
|
# restart. Fall through with empty results so the loop below
|
||||||
|
# drains every requested key with set_result(None).
|
||||||
|
_LOGGER.error('get prop batch failed, %s', err)
|
||||||
|
results = []
|
||||||
|
|
||||||
for result in results:
|
for result in results:
|
||||||
if not all(
|
if not all(
|
||||||
|
|||||||
Reference in New Issue
Block a user