Skip to content

Fix dateless dag.test and tasks test destroying unrelated Dag runs - #73813

Merged
henry3260 merged 2 commits into
apache:mainfrom
Eason09053360:fix-tasks-test-deleting-unrelated-dag-runs-v2
Oct 6, 2026
Merged

henry3260 merged 2 commits into
apache:mainfrom
Eason09053360:fix-tasks-test-deleting-unrelated-dag-runs-v2

Conversation

@Eason09053360

Copy link
Copy Markdown
Contributor

Reopening #72656, which was closed by the one-time open PR limit sweep.

related: #72656

Why

airflow tasks test and DAG.test() can delete a Dag run the user triggered from the
UI, along with its task instances.

Airflow 3 lets runs have no logical date — manual and asset-triggered runs store
NULL — but the helper behind both entry points still treats an absent date as
"match anything":

  • get_or_create_dagrun deletes the run occupying the logical date it is about to use.
    The lookup uses ==, which SQLAlchemy renders as IS NULL, so a dateless test deletes
    an arbitrary dateless run — and DagRun.task_instances cascades.
  • DAG.test() first clears task instances via clear_dags, passing the logical date as
    both bounds. None drops both, leaving TaskInstance.dag_id == <dag_id> — every run
    of the Dag.

NULL dates cannot collide under the (dag_id, logical_date) unique key, so both
operations are skipped when the date is absent.

What

Both call sites guarded, one regression test each.

session.commit() became session.flush(): the line moves in this diff anyway, and
airflow-core forbids a callee committing a session it was handed.

Repeated dateless dag.test() calls now accumulate runs instead of each deleting the
last. --logical-date <D> still replaces a real run sitting at D.


Was generative AI tooling used to co-author this PR?
  • Yes — Claude Code (Opus 5)

Generated-by: Claude Code (Opus 5) following the guidelines

Airflow 3 allows Dag runs without a logical date, which the helper behind
these two debugging commands never accounted for. An absent date widened
both its collision lookup and its pre-test clear into match-everything
queries, so testing a single task could delete a run the user had
triggered from the UI, along with its task instances and their history.

A command whose whole purpose is local debugging must not touch data it
was never pointed at.
@Eason09053360
Eason09053360 force-pushed the fix-tasks-test-deleting-unrelated-dag-runs-v2 branch from a3c27b5 to c0eda11 Compare September 28, 2026 04:29
@fat-catTW

Copy link
Copy Markdown
Contributor

Thanks for the fix.
Look great!

@henry3260 henry3260 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants