Example #1
0
 def get_active_tasks(self, status=None):
     if status:
         for task in six.itervalues(self._status_tasks[status]):
             yield task
     else:
         for task in six.itervalues(self._tasks):
             yield task
Example #2
0
 def get_active_tasks(self, status=None):
     if status:
         for task in six.itervalues(self._status_tasks[status]):
             yield task
     else:
         for task in six.itervalues(self._tasks):
             yield task
Example #3
0
    def load(self):
        if os.path.exists(self._state_path):
            logger.info("Attempting to load state from %s", self._state_path)
            try:
                with open(self._state_path, 'rb') as fobj:
                    state = pickle.load(fobj)
            except BaseException:
                logger.exception("Error when loading state. Starting from clean slate.")
                return

            self._tasks, self._active_workers = state
            self._status_tasks = collections.defaultdict(dict)
            for task in six.itervalues(self._tasks):
                self._status_tasks[task.status][task.id] = task

            # Convert from old format
            # TODO: this is really ugly, we need something more future-proof
            # Every time we add an attribute to the Worker class, this code needs to be updated
            for k, v in six.iteritems(self._active_workers):
                if isinstance(v, float):
                    self._active_workers[k] = Worker(worker_id=k, last_active=v)

            if any(not hasattr(w, 'tasks') for k, w in six.iteritems(self._active_workers)):
                # If you load from an old format where Workers don't contain tasks.
                for k, worker in six.iteritems(self._active_workers):
                    worker.tasks = set()
                for task in six.itervalues(self._tasks):
                    for worker_id in task.workers:
                        self._active_workers[worker_id].tasks.add(task)
        else:
            logger.info("No prior state file exists at %s. Starting with clean slate", self._state_path)
Example #4
0
    def load(self):
        if os.path.exists(self._state_path):
            logger.info("Attempting to load state from %s", self._state_path)
            try:
                with open(self._state_path, 'rb') as fobj:
                    state = pickle.load(fobj)
            except BaseException:
                logger.exception("Error when loading state. Starting from clean slate.")
                return

            self._tasks, self._active_workers = state
            self._status_tasks = collections.defaultdict(dict)
            for task in six.itervalues(self._tasks):
                self._status_tasks[task.status][task.id] = task

            # Convert from old format
            # TODO: this is really ugly, we need something more future-proof
            # Every time we add an attribute to the Worker class, this code needs to be updated
            for k, v in six.iteritems(self._active_workers):
                if isinstance(v, float):
                    self._active_workers[k] = Worker(worker_id=k, last_active=v)

            if any(not hasattr(w, 'tasks') for k, w in six.iteritems(self._active_workers)):
                # If you load from an old format where Workers don't contain tasks.
                for k, worker in six.iteritems(self._active_workers):
                    worker.tasks = set()
                for task in six.itervalues(self._tasks):
                    for worker_id in task.workers:
                        self._active_workers[worker_id].tasks.add(task)
        else:
            logger.info("No prior state file exists at %s. Starting with clean slate", self._state_path)
Example #5
0
 def _send_email(self, fail_counts, disable_counts, scheduling_counts, fail_expls, owner):
     num_failures = sum(six.itervalues(fail_counts))
     num_disables = sum(six.itervalues(disable_counts))
     num_scheduling_failures = sum(six.itervalues(scheduling_counts))
     subject_parts = [
         _plural_format('{} failure{}', num_failures),
         _plural_format('{} disable{}', num_disables),
         _plural_format('{} scheduling failure{}', num_scheduling_failures),
     ]
     subject_base = ', '.join(filter(None, subject_parts))
     if subject_base:
         prefix = '' if owner in self._default_owner else 'Your tasks have '
         subject = 'Luigi: {}{} in the last {} minutes'.format(
             prefix, subject_base, self._config.email_interval)
         email_body = self._email_body(fail_counts, disable_counts, scheduling_counts, fail_expls)
         send_email(subject, email_body, email().sender, (owner,))
Example #6
0
 def _send_email(self, fail_counts, disable_counts, scheduling_counts, fail_expls, owner):
     num_failures = sum(six.itervalues(fail_counts))
     num_disables = sum(six.itervalues(disable_counts))
     num_scheduling_failures = sum(six.itervalues(scheduling_counts))
     subject_parts = [
         _plural_format('{} failure{}', num_failures),
         _plural_format('{} disable{}', num_disables),
         _plural_format('{} scheduling failure{}', num_scheduling_failures),
     ]
     subject_base = ', '.join(filter(None, subject_parts))
     if subject_base:
         prefix = '' if owner in self._default_owner else 'Your tasks have '
         subject = 'Luigi: {}{} in the last {} minutes'.format(
             prefix, subject_base, self._config.email_interval)
         email_body = self._email_body(fail_counts, disable_counts, scheduling_counts, fail_expls)
         send_email(subject, email_body, email().sender, (owner,))
Example #7
0
 def get_active_workers(self, last_active_lt=None, last_get_work_gt=None):
     for worker in six.itervalues(self._active_workers):
         if last_active_lt is not None and worker.last_active >= last_active_lt:
             continue
         last_get_work = getattr(worker, "last_get_work", None)
         if last_get_work_gt is not None and (last_get_work is None or last_get_work <= last_get_work_gt):
             continue
         yield worker
Example #8
0
 def get_active_workers(self, last_active_lt=None, last_get_work_gt=None):
     for worker in six.itervalues(self._active_workers):
         if last_active_lt is not None and worker.last_active >= last_active_lt:
             continue
         last_get_work = getattr(worker, 'last_get_work', None)
         if last_get_work_gt is not None and (
                 last_get_work is None or last_get_work <= last_get_work_gt):
             continue
         yield worker
Example #9
0
    def load(self):
        if os.path.exists(self._state_path):
            logger.info("Attempting to load state from %s", self._state_path)
            try:
                with open(self._state_path, 'rb') as fobj:
                    state = pickle.load(fobj)
            except BaseException:
                logger.exception("Error when loading state. Starting from empty state.")
                return

            self.set_state(state)
            self._status_tasks = collections.defaultdict(dict)
            for task in six.itervalues(self._tasks):
                self._status_tasks[task.status][task.id] = task
        else:
            logger.info("No prior state file exists at %s. Starting with empty state", self._state_path)
Example #10
0
 def get_active_workers(self, last_active_lt=None):
     for worker in six.itervalues(self._active_workers):
         if last_active_lt is not None and worker.last_active >= last_active_lt:
             continue
         yield worker
Example #11
0
 def get_pending_tasks(self):
     return itertools.chain.from_iterable(six.itervalues(self._status_tasks[status])
                                          for status in [PENDING, RUNNING])
Example #12
0
 def get_running_tasks(self):
     return six.itervalues(self._status_tasks[RUNNING])
Example #13
0
 def get_pending_tasks(self):
     return itertools.chain.from_iterable(
         six.itervalues(self._status_tasks[status])
         for status in [PENDING, RUNNING])
Example #14
0
 def get_running_tasks(self):
     return six.itervalues(self._status_tasks[RUNNING])
Example #15
0
 def get_active_workers(self, last_active_lt=None):
     for worker in six.itervalues(self._active_workers):
         if last_active_lt is not None and worker.last_active >= last_active_lt:
             continue
         yield worker