Skip to content

Commit 6a24e00

Browse files
wzywnoOmer Katz
authored andcommitted
Populate heap when periodic tasks are changed
1 parent a7ada0d commit 6a24e00

File tree

1 file changed

+16
-1
lines changed

1 file changed

+16
-1
lines changed

celery/beat.py

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,7 @@ def __init__(self, app, schedule=None, max_interval=None,
197197
self.max_interval)
198198
self.Producer = Producer or app.amqp.Producer
199199
self._heap = None
200+
self.old_schedulers = None
200201
self.sync_every_tasks = (
201202
app.conf.beat_sync_every if sync_every_tasks is None
202203
else sync_every_tasks)
@@ -257,7 +258,9 @@ def tick(self, event_t=event_t, min=min, heappop=heapq.heappop,
257258
adjust = self.adjust
258259
max_interval = self.max_interval
259260

260-
if self._heap is None:
261+
if (self._heap is None or
262+
not self.schedules_equal(self.old_schedulers, self.schedule)):
263+
self.old_schedulers = self.schedule
261264
self.populate_heap()
262265

263266
H = self._heap
@@ -281,6 +284,18 @@ def tick(self, event_t=event_t, min=min, heappop=heapq.heappop,
281284
return min(verify[0], max_interval)
282285
return min(adjust(next_time_to_run) or max_interval, max_interval)
283286

287+
def schedules_equal(self, a, b):
288+
if a.keys() != b.keys():
289+
return False
290+
for name, model in a.items():
291+
b_model = b.get(name)
292+
if not b_model:
293+
return False
294+
if (hasattr(model.schedule, '__repr__') and
295+
model.schedule.__repr__() != b_model.schedule.__repr__()):
296+
return False
297+
return True
298+
284299
def should_sync(self):
285300
return (
286301
(not self._last_sync or

0 commit comments

Comments
 (0)