Azure / Azure/azure-functions-durable-python

"Non-Deterministic workflow detected" error from deterministic code

Ouverte
#600 3 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
blocked bug fixed-in-v2 known-regression
Langage dominant
Python
Étoiles
157
Forks
70
Merge moyen
2 j 10 h
PR mergées (30 j)
2

Description

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

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Commencez par exécuter la reproduction minimale de repro_nondeterminism.py avec la configuration de function_app.py, en utilisant la chaîne d’exception fournie et la comparaison plus courte avec "x". Suivez la manière dont l’exception de l’activité est signalée lors de la relecture de l’orchestration et des vérifications de déterminisme ; le travail est terminé lorsque le workflow atteint l’état Failed et expose l’exception de l’activité sans erreur non déterministe.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
azure, python
Domaine
backend, distributed-systems
Type d'issue
Bug
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Calme
Clarté
Plutôt claire
Accessibilité débutants
45/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.