microsoft / microsoft/durabletask-python
[azure-functions-durable] Orchestrator context parameter name is fixed to `context`, blocking access to `func.Context`
Nessuno ha ancora preso questa issue.
- Lingua principale
- Python
- Stelle
- 40
- Fork
- 33
- Merge medio
- 2g 2h
- PR unite (30g)
- 6
Descrizione
Summary
In the azure-functions-durable (V2) package, the parameter that receives the
orchestration context is effectively hardcoded to the name context. As a
consequence:
- A user-supplied
context_nameother than"context"on
@app.orchestration_trigger(...)does not work — the host cannot bind the
trigger to the generated handle. - There is no way for an orchestrator to also receive an
azure.functions.Context(func.Context) parameter, because the Functions
host injectsfunc.Contextonly into a parameter named exactlycontext
that is not a trigger binding — and that name is always consumed by the
orchestrationTrigger binding.
This matches V1 behavior (see "Not a regression" below), so it is not a
regression introduced by V2. Filing this to track it as a potential V2
improvement to be considered after the Functions PR merges and the beta
release ships.
Mechanism / relevant code paths
The Azure Functions host binds a trigger to a function parameter by name,
and it inspects the generated handle (not the user's function).
-
The trigger binding is registered with
name=context_name:azure/durable_functions/decorators/durable_app.py—
orchestration_trigger(context_name, ...)calls
OrchestrationTrigger(name=context_name, ...).
-
The generated handle that the host actually indexes hardcodes a parameter
literally namedcontext:azure/durable_functions/orchestrator.py—Orchestrator.create:def handle(context: func.OrchestrationContext) -> str: return Orchestrator(fn).handle(context)- The parameter must be annotated
azure.functions.OrchestrationContext
for the host's orchestrationTrigger binding converter to accept it.
-
Because the host matches the binding
name(context_name) to a parameter
ofhandleby name, they only line up whencontext_name == "context".
Any othercontext_nameleaves the trigger unbound. -
func.Contextinjection: the Python worker injectsfunc.Contextonly into
a parameter named exactlycontextthat is not itself a trigger binding.
Since the orchestrationTrigger always occupies thecontextname, there is
no freecontextparameter forfunc.Contextto be injected into. -
Separately, durabletask's executor invokes the user's orchestrator as
fn(ctx, input)— there is no slot in that calling convention for a
func.Contextobject to be passed through to user code.
Not a regression (V1 parity)
V1 has the same structural constraint. In
azure-functions-durable-python's azure/durable_functions/orchestrator.py,
Orchestrator.create also registers a single-parameter
def handle(context: func.OrchestrationContext), so a V1 orchestrator could
never receive a working func.Context parameter either. V2 preserves this
behavior.
Related parity gap: function_context contents
The V1-compat DurableOrchestrationContext adapter currently exposes an empty
function_context. V1's function_context is not necessarily empty: in
azure/durable_functions/models/DurableOrchestrationContext.py, __init__
consumes a fixed set of named fields (history, instanceId, isReplaying,
parentInstanceId, input, upperSchemaVersion, maximumShortTimerDuration,
longRunningTimerIntervalDuration, upperSchemaVersionNew) and funnels every
remaining field of the orchestration-trigger JSON into
FunctionContext(**kwargs). As of today the WebJobs extension injects at least
one such field — defaultHttpAsyncRequestSleepTimeMillseconds (observed value
30000, the durable-HTTP async polling interval) — so a live V1
function_context carries that value.
V2 receives the orchestration input via a protobuf trigger that does not carry
these arbitrary extra fields, so the compat adapter has no source to populate
function_context from. This is a minor parity gap to consider alongside the
context-name / func.Context work above.
Notes
- Out of scope for the current parity-focused Functions PR; capturing here so
it can be picked up as a V2 improvement after the beta release.
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia da azure/durable_functions/decorators/durable_app.py e azure/durable_functions/orchestrator.py, in particolare orchestration_trigger e Orchestrator.create. Traccia il modo in cui viene indicizzato l’handle generato e in cui durabletask richiama la funzione utente; quindi esamina l’adattatore di compatibilità V1 e la gestione di function_context in DurableOrchestrationContext. Il lavoro sarebbe concluso quando sarà stato concordato un approccio V2 per i nomi di contesto personalizzati, l’accesso a func.Context e la relativa lacuna di parità di function_context.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Valutazione
- Stack tecnologico
- azure, python
- Ambito
- backend
- Tipo di issue
- Funzionalità
- Difficoltà
- 4/5
- Tempo stimato
- 3-5 giorni
- Stato di attività
- Tranquilla
- Chiarezza
- Abbastanza chiara
- Idoneità per principianti
- 45/100