potiuk commented on PR #65869:
URL: https://github.com/apache/airflow/pull/65869#issuecomment-5464457372

   Picking this up after too long a silence — apologies, @Vamsi-klu's question 
has been sitting unanswered since 19 July.
   
   First, to close out my original review: @moomindani's analysis settles it, 
and against this PR. `_launch_job` is never reached from a 
`DatabricksWorkflowTaskGroup` member — the workflow branch of `execute()` only 
pulls and monitors the launch task's run metadata, and the workflow JSON is 
built earlier by the auto-added launch task via 
`_CreateDatabricksWorkflowOperator`. `render_template_fields` does run for 
every member, but inside that member's own task instance, which starts after 
the job already exists. So the render pass added here cannot affect the 
reported scenario. @jroachgolf84 reached the same conclusion when he moved this 
back to draft.
   
   ### On the context semantics
   
   > The member task instance does not exist when the launch task builds the 
workflow, so task-scoped expressions such as `{{ ti }}` would otherwise resolve 
against the launch task.
   
   Launch-task context is the right contract, and I think it is the only one 
the architecture permits.
   
   One Databricks job is created for the whole group before any member task 
instance exists, so task-scoped expressions (`{{ ti }}`, `{{ task_instance }}`, 
and anything derived from them such as XCom pulls) have no member TI to resolve 
against. There is no correct value available at that point — only a misleading 
one taken from the launch task.
   
   Run-scoped expressions are a different matter: `{{ ds }}`, `{{ dag_run }}`, 
`{{ params }}`, `{{ data_interval_start }}` and friends are fully defined when 
the launch task runs, and are identical for every member of the group. Those 
cover the case in #46563, where the fields in question are `application_args` 
and `spark_conf`.
   
   So the contract I would like to see implemented and documented:
   
   - Render each member's declared `template_fields` against the **launch 
task's** context while building the workflow JSON.
   - **Document** that task-scoped expressions are not supported for 
workflow-group members, rather than silently resolving them against the launch 
task. A user who writes `{{ ti.xcom_pull(...) }}` in a member field should find 
out from the docs, not from a value that is quietly wrong.
   
   If a later change needs genuine per-member rendering, that requires 
deferring JSON construction until the member TIs exist, which is a much larger 
change to how the task group launches. Not something to solve here.
   
   ### Carrying it forward
   
   @Vamsi-klu — please go ahead with the replacement patch on that basis: drop 
the whole-payload render from `_launch_job`, render each child's declared 
`template_fields` while building the workflow JSON, and add the 
`DatabricksWorkflowTaskGroup` regression test. A fresh PR from your fork is 
cleaner than granting access to this branch, since the approach differs from 
what is here.
   
   @jroachgolf84 — thank you for the original investigation and for converting 
this to draft rather than pushing it through; the analysis in this thread is 
what made the real path findable. Would you be happy for @Vamsi-klu to carry 
it, with this PR closed once the replacement is open?
   
   Please link the new PR back to this one and to #46563 so the reasoning above 
does not have to be rediscovered a third time.
   
   ---
   Drafted-by: Claude Code (Opus 5); reviewed by @potiuk before posting
   


-- 
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.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to