Browse Source

Populate heap when periodic tasks are changed

Wojciech Żywno 8 years ago
parent
commit
6a24e00b7e
1 changed files with 16 additions and 1 deletions
  1. 16 1
      celery/beat.py

+ 16 - 1
celery/beat.py

@@ -197,6 +197,7 @@ class Scheduler(object):
                              self.max_interval)
         self.Producer = Producer or app.amqp.Producer
         self._heap = None
+        self.old_schedulers = None
         self.sync_every_tasks = (
             app.conf.beat_sync_every if sync_every_tasks is None
             else sync_every_tasks)
@@ -257,7 +258,9 @@ class Scheduler(object):
         adjust = self.adjust
         max_interval = self.max_interval
 
-        if self._heap is None:
+        if (self._heap is None or
+                not self.schedules_equal(self.old_schedulers, self.schedule)):
+            self.old_schedulers = self.schedule
             self.populate_heap()
 
         H = self._heap
@@ -281,6 +284,18 @@ class Scheduler(object):
                 return min(verify[0], max_interval)
         return min(adjust(next_time_to_run) or max_interval, max_interval)
 
+    def schedules_equal(self, a, b):
+        if a.keys() != b.keys():
+            return False
+        for name, model in a.items():
+            b_model = b.get(name)
+            if not b_model:
+                return False
+            if (hasattr(model.schedule, '__repr__') and
+                    model.schedule.__repr__() != b_model.schedule.__repr__()):
+                return False
+        return True
+
     def should_sync(self):
         return (
             (not self._last_sync or