RNHTTR commented on a change in pull request #14321:
URL: https://github.com/apache/airflow/pull/14321#discussion_r584217795
##########
File path: airflow/jobs/scheduler_job.py
##########
@@ -1696,10 +1696,18 @@ def _schedule_dag_run(
and dag.dagrun_timeout
and dag_run.start_date < timezone.utcnow() - dag.dagrun_timeout
):
- dag_run.state = State.FAILED
- dag_run.end_date = timezone.utcnow()
- self.log.info("Run %s of %s has timed-out", dag_run.run_id,
dag_run.dag_id)
+ dag_run.set_state(State.FAILED)
+ unfinished_task_instances = (
+ session.query(TI)
+ .filter(TI.dag_id == dag_run.dag_id)
+ .filter(TI.execution_date == dag_run.execution_date)
+ .filter(TI.state.in_(State.unfinished))
+ )
+ for task_instance in unfinished_task_instances:
+ task_instance.state = State.SKIPPED
Review comment:
E.g:
``` python
def test_do_schedule_max_active_runs_dag_timed_out(self):
"""Test that tasks are set to a finished state when their DAG times
out"""
dag = DAG(
dag_id='test_max_active_run_with_dag_timed_out',
start_date=DEFAULT_DATE,
schedule_interval='@once',
max_active_runs=1,
catchup=True,
)
# Arbitrary timeout long enough to allow run2 to instantiate and queue a
task
dag.dagrun_timeout = datetime.timedelta(seconds=10)
with dag:
task1 = BashOperator(
task_id='task1',
bash_command=' for((i=1;i<=600;i+=1)); do sleep "$i"; done',
)
session = settings.Session()
dagbag = DagBag(
dag_folder=os.devnull,
include_examples=False,
read_dags_from_db=True,
)
dagbag.bag_dag(dag=dag, root_dag=dag)
dagbag.sync_to_db(session=session)
run1 = dag.create_dagrun(
run_type=DagRunType.SCHEDULED,
execution_date=DEFAULT_DATE,
state=State.RUNNING,
session=session,
)
run2 = dag.create_dagrun(
run_type=DagRunType.SCHEDULED,
execution_date=DEFAULT_DATE + timedelta(hours=1),
state=State.RUNNING,
session=session,
)
sleep(10)
dag.sync_to_db(session=session)
job = SchedulerJob(subdir=os.devnull)
job.executor = MockExecutor(do_update=False)
job.processor_agent = mock.MagicMock(spec=DagFileProcessorAgent)
num_queued = job._do_scheduling(session)
assert num_queued == 1
ti = run2.get_task_instance(task1.task_id, session)
assert ti.state == State.QUEUED
```
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]