Avoid a zeroconf race condition (#56240)

This commit is contained in:
jjlawren 2021-09-15 03:07:31 -05:00 committed by GitHub
parent 53d5a59257
commit 0619069ae6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -485,6 +485,15 @@ class SonosSpeaker:
#
# Speaker availability methods
#
@callback
def _async_reset_seen_timer(self):
"""Reset the _seen_timer scheduler."""
if self._seen_timer:
self._seen_timer()
self._seen_timer = self.hass.helpers.event.async_call_later(
SEEN_EXPIRE_TIME.total_seconds(), self.async_unseen
)
async def async_seen(self, soco: SoCo | None = None) -> None:
"""Record that this speaker was seen right now."""
if soco is not None:
@ -492,12 +501,7 @@ class SonosSpeaker:
was_available = self.available
if self._seen_timer:
self._seen_timer()
self._seen_timer = self.hass.helpers.event.async_call_later(
SEEN_EXPIRE_TIME.total_seconds(), self.async_unseen
)
self._async_reset_seen_timer()
if was_available:
self.async_write_entity_states()
@ -512,8 +516,6 @@ class SonosSpeaker:
if self._is_ready and not self.subscriptions_failed:
done = await self.async_subscribe()
if not done:
assert self._seen_timer is not None
self._seen_timer()
await self.async_unseen()
self.async_write_entity_states()
@ -522,10 +524,6 @@ class SonosSpeaker:
self, callback_timestamp: datetime.datetime | None = None
) -> None:
"""Make this player unavailable when it was not seen recently."""
if self._seen_timer:
self._seen_timer()
self._seen_timer = None
if callback_timestamp:
# Called by a _seen_timer timeout, check mDNS one more time
# This should not be checked in an "active" unseen scenario
@ -534,9 +532,7 @@ class SonosSpeaker:
aiozeroconf = await zeroconf.async_get_async_instance(self.hass)
if await aiozeroconf.async_get_service_info(MDNS_SERVICE, zcname):
# We can still see the speaker via zeroconf check again later.
self._seen_timer = self.hass.helpers.event.async_call_later(
SEEN_EXPIRE_TIME.total_seconds(), self.async_unseen
)
self._async_reset_seen_timer()
return
_LOGGER.debug(
@ -546,6 +542,10 @@ class SonosSpeaker:
self._share_link_plugin = None
if self._seen_timer:
self._seen_timer()
self._seen_timer = None
if self._poll_timer:
self._poll_timer()
self._poll_timer = None
@ -565,11 +565,7 @@ class SonosSpeaker:
await self.async_unsubscribe()
self.soco = soco
await self.async_subscribe()
if self._seen_timer:
self._seen_timer()
self._seen_timer = self.hass.helpers.event.async_call_later(
SEEN_EXPIRE_TIME.total_seconds(), self.async_unseen
)
self._async_reset_seen_timer()
self.async_write_entity_states()
#