def METHOD_NAME(self) -> List[AsyncJob]:
    """Checks jobs status in advance and restart if some failed.
    :return: list of completed jobs
    """
    completed_jobs = []
    running_jobs = []
    failed_num = 0
    update_in_batch(api=self._api.api, jobs=self._running_jobs)
    self._wait_throttle_limit_down()
    for job in self._running_jobs:
        if job.failed:
            if isinstance(job, ParentAsyncJob):
                # if this job is a ParentAsyncJob, it holds X number of jobs
                # we want to check that none of these nested jobs have exceeded MAX_NUMBER_OF_ATTEMPTS
                for nested_job in job._jobs:
                    if nested_job.attempt_number >= self.MAX_NUMBER_OF_ATTEMPTS:
                        raise JobException(f"{nested_job}: failed more than {self.MAX_NUMBER_OF_ATTEMPTS} times. Terminating...")
            if job.attempt_number >= self.MAX_NUMBER_OF_ATTEMPTS:
                raise JobException(f"{job}: failed more than {self.MAX_NUMBER_OF_ATTEMPTS} times. Terminating...")
            elif job.attempt_number == 2:
                logger.info("%s: failed second time, trying to split job into smaller jobs.", job)
                smaller_jobs = job.split_job()
                grouped_jobs = ParentAsyncJob(api=self._api.api, jobs=smaller_jobs, interval=job.interval)
                running_jobs.append(grouped_jobs)
                grouped_jobs.start()
            else:
                logger.info("%s: failed, restarting", job)
                job.restart()
                running_jobs.append(job)
            failed_num += 1
        elif job.completed:
            completed_jobs.append(job)
        else:
            running_jobs.append(job)
    self._running_jobs = running_jobs
    logger.info(f"Completed jobs: {len(completed_jobs)}, Failed jobs: {failed_num}, Running jobs: {len(self._running_jobs)}")
    return completed_jobs