You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Cloudflare Workflow instrumentation leaves pending waitUntil tasks after the flush timeout #24482
import*asSentryfrom"@sentry/cloudflare";import{WorkflowEntrypoint}from"cloudflare:workers";classReproductionWorkflowextendsWorkflowEntrypoint{asyncrun(_event,step){for(letindex=0;index<100;index++){awaitstep.do(`step-${index}`,async()=>index);}}}exportconstReproductionWorkflowWithSentry=Sentry.instrumentWorkflowWithSentry(()=>({// This test endpoint accepts Sentry envelopes but delays its response// for 120 seconds.dsn: "https://public@<delayed-endpoint>/1",tracesSampleRate: 1,enableLogs: false,sendClientReports: false,}),ReproductionWorkflow,);
Steps to Reproduce
Deploy an HTTP endpoint that accepts requests and delays every response for 120 seconds.
Configure the instrumented Workflow’s DSN to use that endpoint.
Deploy and trigger the Workflow with 100 trivial step.do() calls.
In Cloudflare Observability, search the Worker’s events for "tasks did not complete".
Expected Result
Sentry’s flush(2000) timeout should settle all Sentry-owned waitUntil work within two seconds, including cancelling any pending transport request. No waitUntil cancellation warning should be emitted.
Actual Result
Cloudflare emits:
"waitUntil() tasks did not complete within the allowed time after invocation end and have been cancelled."
The Workflow itself completes successfully, but Sentry-owned work remains pending after the flush timeout.
Additional Context
Investigation identified three places where the configured flush timeout was not fully enforced:
The transport drain returned false after its timeout but did not abort the pending fetch request.
Workflow steps reused flushPointReached from the previous step, causing later steps to register unnecessary eager waitUntil flushes.
CloudflareClient.flush() awaited flushLock.finalize() outside the configured timeout.
We reproduced the warning in a deployed Cloudflare Workflow using a transport endpoint that delayed every response for 120 seconds. After addressing all three paths, 20/20 Workflow instances completed with zero matching warnings in Cloudflare Observability.
Each defect has a red/green regression test. The complete @sentry/cloudflare test suite passes (955/955), along with lint, build, and typecheck.
Activity
linear-code commentedon Sep 17, 2026
JS-3714
fix(cloudflare): Enforce flush timeout across Workflow lifecycle
fix(cloudflare): Enforce flush timeout across Workflow lifecycle
fix(cloudflare): Enforce flush timeout across Workflow lifecycle (get…