Skip to content

Commit cf40470

Browse files
authored
fix: scheduling race with the QueryScheduler (#1347)
1 parent b329d99 commit cf40470

3 files changed

Lines changed: 6 additions & 15 deletions

File tree

src/zeroconf/_services/browser.pxd

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,6 @@ cdef class QueryScheduler:
7373
cdef double _clock_resolution_millis
7474
cdef object _question_type
7575

76-
cpdef void schedule_ptr_first_refresh(self, DNSPointer pointer)
77-
7876
cdef void _schedule_ptr_refresh(self, DNSPointer pointer, double expire_time_millis, double refresh_time_millis)
7977

8078
cdef void _schedule_ptr_query(self, _ScheduledPTRQuery scheduled_query)

src/zeroconf/_services/browser.py

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -374,12 +374,6 @@ def stop(self) -> None:
374374
self._next_scheduled_for_alias.clear()
375375
self._query_heap.clear()
376376

377-
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)

tests/services/test_browser.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1185,15 +1185,15 @@ def send(out, addr=const._MDNS_ADDR, port=const._MDNS_PORT, v6_flow_scope=()):
11851185
"disappear._hap._tcp.local.",
11861186
)
11871187

1188-
query_scheduler.schedule_ptr_first_refresh(ptr_record)
1188+
query_scheduler.reschedule_ptr_first_refresh(ptr_record)
11891189
expected_when_time = ptr_record.get_expiration_time(const._EXPIRE_REFRESH_TIME_PERCENT)
11901190
expected_expire_time = ptr_record.get_expiration_time(100)
11911191
ptr_query = _ScheduledPTRQuery(
11921192
ptr_record.alias, ptr_record.name, int(ptr_record.ttl), expected_expire_time, expected_when_time
11931193
)
11941194
assert query_scheduler._query_heap == [ptr_query]
11951195

1196-
query_scheduler.schedule_ptr_first_refresh(ptr2_record)
1196+
query_scheduler.reschedule_ptr_first_refresh(ptr2_record)
11971197
expected_when_time = ptr2_record.get_expiration_time(const._EXPIRE_REFRESH_TIME_PERCENT)
11981198
expected_expire_time = ptr2_record.get_expiration_time(100)
11991199
ptr2_query = _ScheduledPTRQuery(
@@ -1268,7 +1268,7 @@ def send(out, addr=const._MDNS_ADDR, port=const._MDNS_PORT, v6_flow_scope=()):
12681268
"zoomer._hap._tcp.local.",
12691269
)
12701270

1271-
query_scheduler.schedule_ptr_first_refresh(ptr_record)
1271+
query_scheduler.reschedule_ptr_first_refresh(ptr_record)
12721272
expected_when_time = ptr_record.get_expiration_time(const._EXPIRE_REFRESH_TIME_PERCENT)
12731273
expected_expire_time = ptr_record.get_expiration_time(100)
12741274
ptr_query = _ScheduledPTRQuery(

0 commit comments

Comments
 (0)