Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 4 additions & 1 deletion airflow/models/taskinstance.py
Original file line number Diff line number Diff line change
Expand Up @@ -2216,7 +2216,10 @@ def _check_and_change_state_before_execution(

ti.state = TaskInstanceState.RUNNING
ti.emit_state_change_metric(TaskInstanceState.RUNNING)
ti.external_executor_id = external_executor_id

if external_executor_id:
ti.external_executor_id = external_executor_id

ti.end_date = None
if not test_mode:
session.merge(ti).task = task
Expand Down
2 changes: 2 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -917,6 +917,7 @@ def maker(
run_id=None,
run_type=None,
data_interval=None,
external_executor_id=None,
map_index=-1,
**kwargs,
) -> TaskInstance:
Expand All @@ -937,6 +938,7 @@ def maker(
(ti,) = dagrun.task_instances
ti.task = task
ti.state = state
ti.external_executor_id = external_executor_id
ti.map_index = map_index

dag_maker.session.flush()
Expand Down
47 changes: 46 additions & 1 deletion tests/models/test_taskinstance.py
Original file line number Diff line number Diff line change
Expand Up @@ -1785,7 +1785,11 @@ def post_execute(self, context, result=None):
ti.run()

def test_check_and_change_state_before_execution(self, create_task_instance):
ti = create_task_instance(dag_id="test_check_and_change_state_before_execution")
expected_external_executor_id = "banana"
ti = create_task_instance(
dag_id="test_check_and_change_state_before_execution",
external_executor_id=expected_external_executor_id,
)
SerializedDagModel.write_dag(ti.task.dag)

serialized_dag = SerializedDagModel.get(ti.task.dag.dag_id).dag
Expand All @@ -1794,6 +1798,46 @@ def test_check_and_change_state_before_execution(self, create_task_instance):
assert ti_from_deserialized_task._try_number == 0
assert ti_from_deserialized_task.check_and_change_state_before_execution()
# State should be running, and try_number column should be incremented
assert ti_from_deserialized_task.external_executor_id == expected_external_executor_id
assert ti_from_deserialized_task.state == State.RUNNING
assert ti_from_deserialized_task._try_number == 1

def test_check_and_change_state_before_execution_provided_id_overrides(self, create_task_instance):
expected_external_executor_id = "banana"
ti = create_task_instance(
dag_id="test_check_and_change_state_before_execution",
external_executor_id="apple",
)
assert ti.external_executor_id == "apple"
SerializedDagModel.write_dag(ti.task.dag)

serialized_dag = SerializedDagModel.get(ti.task.dag.dag_id).dag
ti_from_deserialized_task = TI(task=serialized_dag.get_task(ti.task_id), run_id=ti.run_id)

assert ti_from_deserialized_task._try_number == 0
assert ti_from_deserialized_task.check_and_change_state_before_execution(
external_executor_id=expected_external_executor_id
)
# State should be running, and try_number column should be incremented
assert ti_from_deserialized_task.external_executor_id == expected_external_executor_id
assert ti_from_deserialized_task.state == State.RUNNING
assert ti_from_deserialized_task._try_number == 1

def test_check_and_change_state_before_execution_with_exec_id(self, create_task_instance):
expected_external_executor_id = "minions"
ti = create_task_instance(dag_id="test_check_and_change_state_before_execution")
assert ti.external_executor_id is None
SerializedDagModel.write_dag(ti.task.dag)

serialized_dag = SerializedDagModel.get(ti.task.dag.dag_id).dag
ti_from_deserialized_task = TI(task=serialized_dag.get_task(ti.task_id), run_id=ti.run_id)

assert ti_from_deserialized_task._try_number == 0
assert ti_from_deserialized_task.check_and_change_state_before_execution(
external_executor_id=expected_external_executor_id
)
# State should be running, and try_number column should be incremented
assert ti_from_deserialized_task.external_executor_id == expected_external_executor_id
assert ti_from_deserialized_task.state == State.RUNNING
assert ti_from_deserialized_task._try_number == 1

Expand All @@ -1820,6 +1864,7 @@ def test_check_and_change_state_before_execution_dep_not_met_already_running(sel

assert not ti_from_deserialized_task.check_and_change_state_before_execution()
assert ti_from_deserialized_task.state == State.RUNNING
assert ti_from_deserialized_task.external_executor_id is None

def test_check_and_change_state_before_execution_dep_not_met_not_runnable_state(
self, create_task_instance
Expand Down