|  | @@ -199,13 +199,6 @@ class Scheduler(object):
 | 
											
												
													
														|  |                      'options': {'expires': 12 * 3600}}
 |  |                      'options': {'expires': 12 * 3600}}
 | 
											
												
													
														|  |          self.update_from_dict(entries)
 |  |          self.update_from_dict(entries)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    def maybe_due(self, entry, producer=None):
 |  | 
 | 
											
												
													
														|  | -        is_due, next_time_to_run = entry.is_due()
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -        if is_due:
 |  | 
 | 
											
												
													
														|  | -            self.apply_entry(entry, producer=producer, advance=True)
 |  | 
 | 
											
												
													
														|  | -        return next_time_to_run
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |      def apply_entry(self, entry, producer=None):
 |  |      def apply_entry(self, entry, producer=None):
 | 
											
												
													
														|  |          info('Scheduler: Sending due task %s (%s)', entry.name, entry.task)
 |  |          info('Scheduler: Sending due task %s (%s)', entry.name, entry.task)
 | 
											
												
													
														|  |          try:
 |  |          try:
 | 
											
										
											
												
													
														|  | @@ -216,20 +209,26 @@ class Scheduler(object):
 | 
											
												
													
														|  |          else:
 |  |          else:
 | 
											
												
													
														|  |              debug('%s sent. id->%s', entry.task, result.id)
 |  |              debug('%s sent. id->%s', entry.task, result.id)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +    def is_due(self, entry):
 | 
											
												
													
														|  | 
 |  | +        return entry.is_due()
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |      def tick(self, event_t=event_t, min=min,
 |  |      def tick(self, event_t=event_t, min=min,
 | 
											
												
													
														|  | -             heappop=heapq.heappop, heappush=heapq.heappush):
 |  | 
 | 
											
												
													
														|  | 
 |  | +             heappop=heapq.heappop, heappush=heapq.heappush,
 | 
											
												
													
														|  | 
 |  | +             heapify=heapq.heapify):
 | 
											
												
													
														|  |          """Run a tick, that is one iteration of the scheduler.
 |  |          """Run a tick, that is one iteration of the scheduler.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          Executes all due tasks.
 |  |          Executes all due tasks.
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          """
 |  |          """
 | 
											
												
													
														|  | 
 |  | +        max_interval = self.max_interval
 | 
											
												
													
														|  |          H = self._heap
 |  |          H = self._heap
 | 
											
												
													
														|  |          if H is None:
 |  |          if H is None:
 | 
											
												
													
														|  | -            H = self._heap = [event_t(e.is_due()[1], 5, e)
 |  | 
 | 
											
												
													
														|  | 
 |  | +            H = self._heap = [event_t(e.is_due()[1] or 0, 5, e)
 | 
											
												
													
														|  |                                for e in values(self.schedule)]
 |  |                                for e in values(self.schedule)]
 | 
											
												
													
														|  | 
 |  | +            heapify(H)
 | 
											
												
													
														|  |          event = H[0]
 |  |          event = H[0]
 | 
											
												
													
														|  |          entry = event[2]
 |  |          entry = event[2]
 | 
											
												
													
														|  | -        is_due, next_time_to_run = entry.is_due()
 |  | 
 | 
											
												
													
														|  | 
 |  | +        is_due, next_time_to_run = self.is_due(entry)
 | 
											
												
													
														|  |          if is_due:
 |  |          if is_due:
 | 
											
												
													
														|  |              verify = heappop(H)
 |  |              verify = heappop(H)
 | 
											
												
													
														|  |              if verify is event:
 |  |              if verify is event:
 | 
											
										
											
												
													
														|  | @@ -239,8 +238,8 @@ class Scheduler(object):
 | 
											
												
													
														|  |                  return 0
 |  |                  return 0
 | 
											
												
													
														|  |              else:
 |  |              else:
 | 
											
												
													
														|  |                  heappush(H, verify)
 |  |                  heappush(H, verify)
 | 
											
												
													
														|  | -                return min(verify[0], self.max_interval)
 |  | 
 | 
											
												
													
														|  | -        return min(next_time_to_run, self.max_interval)
 |  | 
 | 
											
												
													
														|  | 
 |  | +                return min(verify[0], max_interval)
 | 
											
												
													
														|  | 
 |  | +        return min(next_time_to_run or max_interval, max_interval)
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      def should_sync(self):
 |  |      def should_sync(self):
 | 
											
												
													
														|  |          return (
 |  |          return (
 | 
											
										
											
												
													
														|  | @@ -477,9 +476,10 @@ class Service(object):
 | 
											
												
													
														|  |          try:
 |  |          try:
 | 
											
												
													
														|  |              while not self._is_shutdown.is_set():
 |  |              while not self._is_shutdown.is_set():
 | 
											
												
													
														|  |                  interval = self.scheduler.tick()
 |  |                  interval = self.scheduler.tick()
 | 
											
												
													
														|  | -                debug('beat: Waking up %s.',
 |  | 
 | 
											
												
													
														|  | -                      humanize_seconds(interval, prefix='in '))
 |  | 
 | 
											
												
													
														|  | -                time.sleep(interval)
 |  | 
 | 
											
												
													
														|  | 
 |  | +                if interval:
 | 
											
												
													
														|  | 
 |  | +                    debug('beat: Waking up %s.',
 | 
											
												
													
														|  | 
 |  | +                        humanize_seconds(interval, prefix='in '))
 | 
											
												
													
														|  | 
 |  | +                    time.sleep(interval)
 | 
											
												
													
														|  |          except (KeyboardInterrupt, SystemExit):
 |  |          except (KeyboardInterrupt, SystemExit):
 | 
											
												
													
														|  |              self._is_shutdown.set()
 |  |              self._is_shutdown.set()
 | 
											
												
													
														|  |          finally:
 |  |          finally:
 |