Azure / Azure/azure-functions-durable-python

"Non-Deterministic workflow detected" error from deterministic code

Abierto
#600 3 comentarios 0 reacciones 0 asignados Ver en GitHub
blocked bug fixed-in-v2 known-regression
Lenguaje dominante
Python
Estrellas
157
Forks
70
Merge medio
2 d 10 h
PR fusionados (30 d)
2

Descripción

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

Guía de contribución

Abrir la guía de contribución

Línea de trabajo

Comienza ejecutando la reproducción mínima de repro_nondeterminism.py con la configuración de function_app.py, usando la cadena de excepción proporcionada y la comparación más corta con "x". Rastrea cómo se informa la excepción de la actividad a través de la repetición de la orquestación y las comprobaciones de determinismo; se considera terminado cuando el flujo de trabajo alcanza el estado Failed y expone la excepción de la actividad sin un error no determinista.

Escrito por el modelo de indexación a partir del texto del issue.

Evaluación

Stack tecnológico
azure, python
Área
backend, distributed-systems
Tipo de issue
Error
Dificultad
4/5
Tiempo estimado
3-5 días
Estado de actividad
Tranquilo
Claridad
Bastante claro
Aptitud para principiantes
45/100

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.