fix: scheduling race with the QueryScheduler (#1347) · python-zeroconf/python-zeroconf@cf40470

@@ -374,12 +374,6 @@ def stop(self) -> None:

374374

self._next_scheduled_for_alias.clear()

375375

self._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-383377

def _schedule_ptr_refresh(

384378

self, 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

):

416410

return

417411

current.cancelled = True

412+

del self._next_scheduled_for_alias[pointer.alias]

418413

expire_time_millis = pointer.get_expiration_time(100)

419414

self._schedule_ptr_refresh(pointer, expire_time_millis, refresh_time_millis)

420415

@@ -490,10 +485,8 @@ def _process_ready_types(self) -> None:

490485

if query.when_millis > end_time_millis:

491486

next_scheduled = query

492487

break

493-488+

query = heappop(self._query_heap)

494489

ready_types.add(query.name)

495-496-

heappop(self._query_heap)

497490

del 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

670663

for type_ in self.types.intersection(cached_possible_types(pointer.name)):

671664

if old_record is None:

672665

self._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)

674667

elif pointer.is_expired(now):

675668

self._enqueue_callback(SERVICE_STATE_CHANGE_REMOVED, type_, pointer.alias)

676669

self.query_scheduler.cancel_ptr_refresh(pointer)