Skip to content

Commit 0485739

Browse files
rsichnyiauvipy
authored andcommitted
fix heap being empty after first schedule change (#181)
* fix heap being empty after first schedule change * add schedule equality tests * change test name to fix line length
1 parent 3949ba5 commit 0485739

File tree

2 files changed

+24
-0
lines changed

2 files changed

+24
-0
lines changed

django_celery_beat/schedulers.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,7 @@ class DatabaseScheduler(Scheduler):
194194
_schedule = None
195195
_last_timestamp = None
196196
_initial_read = True
197+
_heap_invalidated = False
197198

198199
def __init__(self, *args, **kwargs):
199200
"""Initialize the database scheduler."""
@@ -294,6 +295,12 @@ def install_default_entries(self, data):
294295
)
295296
self.update_from_dict(entries)
296297

298+
def schedules_equal(self, *args, **kwargs):
299+
if self._heap_invalidated:
300+
self._heap_invalidated = False
301+
return False
302+
return super(DatabaseScheduler, self).schedules_equal(*args, **kwargs)
303+
297304
@property
298305
def schedule(self):
299306
initial = update = False
@@ -311,6 +318,7 @@ def schedule(self):
311318
# the schedule changed, invalidate the heap in Scheduler.tick
312319
if not initial:
313320
self._heap = []
321+
self._heap_invalidated = True
314322
if logger.isEnabledFor(logging.DEBUG):
315323
debug('Current schedule:\n%s', '\n'.join(
316324
repr(entry) for entry in values(self._schedule)),

t/unit/test_schedulers.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -406,6 +406,22 @@ def test_update_scheduler_heap_invalidation(self, monkeypatch):
406406
monkeypatch.setattr(self.s, 'schedule_changed', lambda: True)
407407
self.s.tick()
408408

409+
def test_heap_size_is_constant(self, monkeypatch):
410+
# heap size is constant unless the schedule changes
411+
monkeypatch.setattr(self.s, 'schedule_changed', lambda: True)
412+
expected_heap_size = len(self.s.schedule.values())
413+
self.s.tick()
414+
assert len(self.s._heap) == expected_heap_size
415+
self.s.tick()
416+
assert len(self.s._heap) == expected_heap_size
417+
418+
def test_scheduler_schedules_equality_on_change(self, monkeypatch):
419+
monkeypatch.setattr(self.s, 'schedule_changed', lambda: False)
420+
assert self.s.schedules_equal(self.s.schedule, self.s.schedule)
421+
422+
monkeypatch.setattr(self.s, 'schedule_changed', lambda: True)
423+
assert not self.s.schedules_equal(self.s.schedule, self.s.schedule)
424+
409425

410426
@pytest.mark.django_db()
411427
class test_models(SchedulerCase):

0 commit comments

Comments
 (0)