fix: scheduling race with the QueryScheduler (#1347) · python-zeroconf/python-zeroconf@cf40470
@@ -374,12 +374,6 @@ def stop(self) -> None:
374374self._next_scheduled_for_alias.clear()
375375self._query_heap.clear()
376376377-def schedule_ptr_first_refresh(self, pointer: DNSPointer) -> None:
378-"""Schedule a query for a pointer."""
379-expire_time_millis = pointer.get_expiration_time(100)
380-refresh_time_millis = pointer.get_expiration_time(_EXPIRE_REFRESH_TIME_PERCENT)
381-self._schedule_ptr_refresh(pointer, expire_time_millis, refresh_time_millis)
382-383377def _schedule_ptr_refresh(
384378self, pointer: DNSPointer, expire_time_millis: float_, refresh_time_millis: float_
385379 ) -> None:
@@ -415,6 +409,7 @@ def reschedule_ptr_first_refresh(self, pointer: DNSPointer) -> None:
415409 ):
416410return
417411current.cancelled = True
412+del self._next_scheduled_for_alias[pointer.alias]
418413expire_time_millis = pointer.get_expiration_time(100)
419414self._schedule_ptr_refresh(pointer, expire_time_millis, refresh_time_millis)
420415@@ -490,10 +485,8 @@ def _process_ready_types(self) -> None:
490485if query.when_millis > end_time_millis:
491486next_scheduled = query
492487break
493-488+ query = heappop(self._query_heap)
494489ready_types.add(query.name)
495-496-heappop(self._query_heap)
497490del self._next_scheduled_for_alias[query.alias]
498491# If there is still more than 10% of the TTL remaining
499492# schedule a query again to try to rescue the record
@@ -670,7 +663,7 @@ def async_update_records(self, zc: 'Zeroconf', now: float_, records: List[Record
670663for type_ in self.types.intersection(cached_possible_types(pointer.name)):
671664if old_record is None:
672665self._enqueue_callback(SERVICE_STATE_CHANGE_ADDED, type_, pointer.alias)
673-self.query_scheduler.schedule_ptr_first_refresh(pointer)
666+self.query_scheduler.reschedule_ptr_first_refresh(pointer)
674667elif pointer.is_expired(now):
675668self._enqueue_callback(SERVICE_STATE_CHANGE_REMOVED, type_, pointer.alias)
676669self.query_scheduler.cancel_ptr_refresh(pointer)