Observed failure
Published Rust SDK 3.2.0's long-running workflow worker exits during a bounded Server restart. The same PHP 2.2.3 and Python 2.4.2 workers recover and finish their pending timers. Rust's timer remains waiting after Server is healthy again because the worker process has exited.
Reproduced in the published-artifact timer experiment on Sample App #152, job 113047763895. Server 2.5.9, MySQL 8 and Redis 7. Normal completion and worker SIGKILL/cold replay pass in all three languages. PHP and Python Server-restart cells pass. Rust exits with WorkerShutdown whose primary error is a transport connection refusal from POST /api/worker/workflow-tasks/poll; deregistration also fails while the endpoint is offline. The Rust workflow remains waiting until the observer's 120-second timeout. Cancellation cells have not run in this failed job.
Acceptance
- Long-running worker poll loops recover from bounded transient connection, timeout and retryable service failures with bounded backoff.
- Shutdown remains responsive during backoff. Permanent authentication, capability, protocol and malformed-response failures remain explicit.
- Do not hide handler failures, stale completion or lost authority as transient poll failures.
- Add focused regression tests for recovery and shutdown, run normal Rust checks, publish a qualified patch, then repeat the exact published timer experiment.
This is a product finding from durable-workflow/.github#122. Do not make the experiment pass by restarting the exited worker manually or by weakening its Server-restart assertion.
Observed failure
Published Rust SDK 3.2.0's long-running workflow worker exits during a bounded Server restart. The same PHP 2.2.3 and Python 2.4.2 workers recover and finish their pending timers. Rust's timer remains waiting after Server is healthy again because the worker process has exited.
Reproduced in the published-artifact timer experiment on Sample App #152, job 113047763895. Server 2.5.9, MySQL 8 and Redis 7. Normal completion and worker SIGKILL/cold replay pass in all three languages. PHP and Python Server-restart cells pass. Rust exits with
WorkerShutdownwhose primary error is a transport connection refusal fromPOST /api/worker/workflow-tasks/poll; deregistration also fails while the endpoint is offline. The Rust workflow remains waiting until the observer's 120-second timeout. Cancellation cells have not run in this failed job.Acceptance
This is a product finding from durable-workflow/.github#122. Do not make the experiment pass by restarting the exited worker manually or by weakening its Server-restart assertion.