"Non-Deterministic workflow detected" error from deterministic code

Aberta
#600 3 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
4/5
Tempo estimado
3-5 dias
Facilidade para iniciantes
45/100
Tipo de issue
Bug
Clareza
Razoavelmente clara
Status de atividade
Pouca atividade
Stack de tecnologia
azure, python

Direção de pesquisa

Comece executando a reprodução mínima de repro_nondeterminism.py com a configuração de function_app.py, usando a string de exceção fornecida e a comparação mais curta com "x". Rastreie como a exceção da atividade é reportada por meio do replay da orquestração e das verificações de determinismo; considera-se concluído quando o workflow alcança o status Failed e expõe a exceção da atividade sem um erro não determinístico.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

blocked bug fixed-in-v2 known-regression

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

Linguagem predominante
Python
Estrelas
157
Forks
71
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Abrir no Codespaces

Inicia o contêiner de desenvolvimento do projeto no navegador, com a sua própria conta do GitHub.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de Azure/azure-functions-durable-python

Todas as issues de Azure/azure-functions-durable-python

Issues semelhantes

Mais issues de Python

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.