Azure / Azure/azure-functions-durable-python

"Non-Deterministic workflow detected" error from deterministic code

Offen
#600 3 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen
blocked bug fixed-in-v2 known-regression
Vorherrschende Sprache
Python
Sterne
157
Forks
70
Ø Merge
2 T. 10 Std.
Gemergte PRs (30 T.)
2

Beschreibung

🐛 **Describe the bug**
I have a minimal repro which makes the Function fail with "Non-Deterministic workflow detected" error, even if the code is completely deterministic. If I replace the RuntimeError argument string with "x", then I get the expected behavior. There is something in the exception string which triggers the undesired behavior.

🤔 **Expected behavior**
The Function should end with Failed status with the exception from the activity in the output.

☕ **Steps to reproduce**
Here is the code for a minimal repro: HTTP trigger + trivial orchestration and activity. The activity throws an exception every time. (the SAS signature is fake)

```
import logging
import azure.functions as func
import azure.durable_functions as df

bp = df.Blueprint()
logger = logging.getLogger(__name__)

# ── Trigger ────────────────────────
@bp.route(route="repro")
@bp.durable_client_input(client_name="orchestration_client")
async def http_start_repro(
req: func.HttpRequest, orchestration_client: df.DurableOrchestrationClient
) -> func.HttpResponse:
instance_id = await orchestration_client.start_new("repro_orchestrator")
logger.info(f"Started repro orchestrator with ID '{instance_id}'")
return orchestration_client.create_check_status_response(req, instance_id)

# ── Orchestrator ──────────────────
@bp.orchestration_trigger(context_name="context")
def repro_orchestrator(context: df.DurableOrchestrationContext):
try:
yield context.call_activity("repro_activity")
except Exception as e:
logger.error(f"Repro orchestrator caught: {e}")
raise

# ── Activity ──────────────────────
@bp.activity_trigger(input_name="input_data")
def repro_activity(input_data):
# The sig= value contains /, +, and = which trigger the bug.
raise RuntimeError(
"Download failed: https://example.blob.core.windows.net/container/test.file"
"?sv=2025-07-05&spr=https&st=2026-04-01T10:58:55Z"
"&se=2026-04-02T10:58:55Z&sr=b&sp=r"
"&sig=aB3dE/fG5hI+jK7lM9nO="
)

# ── function_app.py ──────────────
# Save the following as function_app.py in the same directory:

import azure.functions as func
import azure.durable_functions as df
from repro_nondeterminism import bp

app = df.DFApp(http_auth_level=func.AuthLevel.ANONYMOUS)
app.register_blueprint(bp)

```

⚡**If deployed to Azure**
I see the same behavior if deployed to Azure. Please refer to the code.

Beitragsleitfaden

Beitragsleitfaden öffnen

Rechercherichtung

Beginne damit, die minimale Reproduktion aus repro_nondeterminism.py mit dem Setup von function_app.py auszuführen, wobei die bereitgestellte Ausnahmezeichenfolge und der kürzere Vergleich mit "x" verwendet werden. Verfolge, wie die Aktivitätsausnahme über die Orchestrierungswiederholung und die Determinismusprüfungen gemeldet wird; abgeschlossen ist die Aufgabe, wenn der Workflow den Status Failed erreicht und die Aktivitätsausnahme ohne einen nichtdeterministischen Fehler offenlegt.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
azure, python
Bereich
backend, distributed-systems
Issue-Typ
Bug
Schwierigkeit
4/5
Geschätzter Aufwand
3-5 Tage
Aktivitätsstatus
Ruhig
Klarheit
Größtenteils klar
Anfängerfreundlichkeit
45/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.