mirror of
https://github.com/apache/airflow.git
synced 2026-11-04 15:58:21 +00:00
Mapped tasks were the one kind of dynamic work still outside the region model: their instances sat in the sentinel region and were told apart only by map_index. A loop has to be able to contain an expansion, one per pass, and that only works if the expansion owns a region of its own. The coordinate column is renamed in place so large deployments pay for metadata changes, not a table rewrite. No table is rebuilt because SQLite's rebuild would cascade-delete the rows that reference task_instance.id. legacy_task_data_owner, xcom_v1 and rtif_v1 keep map_index because they record the coordinates their rows had before regions existed. The ORM keeps map_index as an alias: Jinja log-filename templates and provider code still read ti.map_index from ORM rows, and removing it needs its own audit. Mapping keeps its existing behaviour. A task's region is born with its placeholder, re-expansion grows or shrinks it in place, and a map never forks. Promoting the placeholder to index 0 stays in place too. Attempts retired before the promotion stay at index -1: they own their XCom, rendered fields and log files by UUID, and moving them could collide with retired attempts already at index 0. A pre-region placeholder never ran, so it has no history to keep; it moves into a freshly minted region and is promoted like any other, instead of being retired as a phantom failed try. Pre-region expansions stay in the sentinel region and keep revising in place, so the upgrade does not rewrite existing rows. Callers that address a task instance by public coordinates now find a task's own region as well as the sentinel. The DagRun wait endpoint reads current producers only and rejects loop results, because which pass's result to return would be ambiguous.