Skip to content

Delayed entity signals can disappear at the due-time transition under Azurite #229

Description

@andystaples

Description

Delayed entity signals intermittently never reach the entity in the Azure Functions Durable E2E suite. This affects both client-scheduled signals and signals scheduled from an orchestration.

The failure reproduced independently in both strict-typing matrices in GitHub Actions run 30422946249:

  • test_client_delayed_signal_is_deferred
  • test_orchestration_delayed_signal_is_deferred

The suite used Durable Functions extension 3.14.0, Azurite 3.36.0, and maxQueuePollingInterval set to one second.

Observed behavior

Host logs show the scheduled EventRaised control message is fetched slightly before the timestamp encoded in its op@<timestamp> event name. DurableTask.Core reschedules the same logical request to the entity. Because the remaining sub-second delay is serialized to Azurite as visibilitytimeout=0, several newly-created queue messages are processed in rapid succession.

For one example scheduled for 04:43:59.5057260Z, the request was first fetched at 04:43:59.344Z and rescheduled repeatedly between 04:43:59.348Z and 04:43:59.408Z. Each iteration successfully enqueued the replacement and checkpointed entity history before deleting its triggering message. The final iteration checkpointed and deleted the trigger without invoking the entity operation; entity state remained absent for the full 30-second polling timeout.

This is not control-queue poison-message exhaustion. DurableTask.AzureStorage has no maximum dequeue count that deletes or abandons a control message. Abandoned messages back off to a maximum 10-minute visibility delay and continue retrying; reaching that delay only emits a poison-message log. In this failure, each early-delivery iteration creates a new queue message, so its dequeue count starts over.

Expected behavior

A scheduled entity operation should remain pending until its due time and then execute exactly once, even when the storage emulator exposes the queue message slightly early.

Possible direction

Investigate the final due-time transition in TaskEntityDispatcher.DetermineWork and the entity scheduler's duplicate/message-sorter state. Separately, round a positive sub-second remaining duration up to a nonzero queue visibility delay, or otherwise prevent the immediate early-delivery loop under Azurite.

Reproduction

Run:

nox -s functions_e2e -- tests/azure-functions-durable/e2e/test_dtask_entities_advanced_e2e.py

The issue is timing-dependent; the full E2E suite increases reproduction frequency.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions