Azure / Azure/azure-functions-durable-python
"Non-Deterministic workflow detected" error from deterministic code
- Ngôn ngữ chính
- Python
- Star
- 157
- Fork
- 70
- Merge trung bình
- 2 ngày 10 giờ
- Pull request đã merge (30 ngày)
- 2
Mô tả
🐛 **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.
Hướng dẫn đóng góp
Hướng nghiên cứu
Bắt đầu bằng cách chạy bản tái hiện tối thiểu từ repro_nondeterminism.py với thiết lập function_app.py, sử dụng chuỗi ngoại lệ được cung cấp và phép so sánh ngắn hơn với "x". Theo dõi cách ngoại lệ của activity được báo cáo qua quá trình replay của orchestration và các bước kiểm tra tính xác định; được xem là hoàn tất khi workflow đạt trạng thái Failed và hiển thị ngoại lệ của activity mà không có lỗi không xác định.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Đánh giá
- Công nghệ
- azure, python
- Lĩnh vực
- backend, distributed-systems
- Loại issue
- Lỗi
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức độ hoạt động
- Ít trao đổi
- Độ rõ ràng
- Khá rõ ràng
- Mức phù hợp với người mới
- 45/100