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,
)
dag.dagrun_timeout = datetime.timedelta(seconds=1)
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,
)
run1_ti = run1.get_task_instance(task1.task_id, session)
run1_ti.state = State.RUNNING
sleep(1)
run2 = dag.create_dagrun(
run_type=DagRunType.SCHEDULED,
execution_date=DEFAULT_DATE + timedelta(seconds=10),
state=State.RUNNING,
session=session,
)
dag.sync_to_db(session=session)
job = SchedulerJob(subdir=os.devnull)
job.executor = MockExecutor()
job.processor_agent = mock.MagicMock(spec=DagFileProcessorAgent)
num_queued = job._do_scheduling(session)
assert run1.state == State.FAILED
assert run1_ti.state == State.SKIPPED
assert run2.state == State.RUNNING
num_queued = job._do_scheduling(session)
run2_ti = run2.get_task_instance(task1.task_id, session)
assert run2_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]