def cleanup_tasks()

in api-server/tesazure/jobs.py [0:0]


def cleanup_tasks():
    """
    Cleans up TES tasks that fulfill one of the four cases:
      - Are in backend but haven't been updated in TASK_BACKEND_CLEANUP_HOURS hours
      - Are in database but haven't been updated in TASK_DATABASE_CLEANUP_HOURS hours
      - Have been running longer than TASK_EXECUTION_TIMEOUT_HOURS
      - Are running but don't exist in backend
    """
    # Backend cleanup must occur before database cleanup
    if current_app.config['TASK_BACKEND_CLEANUP_HOURS'] > current_app.config['TASK_DATABASE_CLEANUP_HOURS']:
        # FIXME - use a more specific exception
        raise Exception("TASK_BACKEND_CLEANUP_HOURS must be less than or equal to TASK_DATABASE_CLEANUP_HOURS.")

    # Cleanup backend tasks
    tasks = TesTask.query.filter(TesTask.updated_ts <= (datetime.utcnow() - timedelta(hours=current_app.config['TASK_BACKEND_CLEANUP_HOURS'])))
    for task in tasks:
        if (compute_backend.backend.get_task(task.backend_id)):
            compute_backend.backend.cancel_task(task.backend_id)

    # Cleanup database
    tasks = TesTask.query.filter(TesTask.updated_ts <= (datetime.utcnow() - timedelta(hours=current_app.config['TASK_DATABASE_CLEANUP_HOURS'])))
    for task in tasks:
        task.delete()

    # Clean orphans & stop long running tasks
    tasks = TesTask.query.filter(TesTask.state == TaskStatus.RUNNING).all()

    for task in tasks:
        if (compute_backend.backend.get_task(task.backend_id) is False):
            task.state = TaskStatus.UNKNOWN  # Orphans map to status Unknown
        elif (task.updated_ts < datetime.utcnow() - timedelta(hours=current_app.config['TASK_EXECUTION_TIMEOUT_HOURS'])):
            compute_backend.backend.cancel_task(task.backend_id)
            task.state = TaskStatus.CANCELED

    db.session.commit()