Skip to content

EXPERIMENT (do not merge): does the tail-forwarding fix stop the Windows crash? - #15006

Closed
petebacondarwin wants to merge 2 commits into
mainfrom
exp/bisect-with-tail-fix
Closed

EXPERIMENT (do not merge): does the tail-forwarding fix stop the Windows crash?#15006
petebacondarwin wants to merge 2 commits into
mainfrom
exp/bisect-with-tail-fix

Conversation

@petebacondarwin

Copy link
Copy Markdown
Contributor

Temporary diagnostic branch. Not for merge — will be closed once it has answered its question. Companion to #15001.

This branch is #14993 plus the bisect harness. Eight rounds of bisecting on Windows CI narrowed the fixtures/dev-registry crash to a single trigger:

Peer that gets killed Assets worker Bound by victim Tail consumer of victim Crashed
worker-entrypoint-with-assets yes yes yes 4/5 reps
worker-entrypoint no yes no 0/3 (11 cycles)
exported-handler-with-assets yes no no 0/3 (14 cycles)

Being an assets worker is not sufficient, and being bound is not sufficient. The only peer whose abrupt death aborts the survivor is the one reached over the tail path through the assets RPC-proxy hop — which is exactly where #14993 stops a departed peer's rejection from escaping unhandled.

Also ruled out along the way: forced dev-server restarts (0/3), hand-written registry churn with no live peer (0/3), idle sessions at any count (0/41), port contention, start order, CPU starvation, and traffic through the binding.

Baseline to beat here is 4/5 reps over 17 kill cycles, so this run does 8 reps of the crashing arm plus both negative controls.

`tail()` returned the forwarding RPC's promise from inside a `try`/`catch`, so
the rejection a departed peer produces landed outside the `try` and escaped as
an unhandled rejection. The `catch` only ever guarded the synchronous `JSON`
work, so a peer going away produced no diagnostic at all.

Await the call so the rejection is caught and reported.
Round 8 narrowed the trigger to killing a peer that is both an assets worker
and the victim's tail consumer, which is the path PR #14993 stops dropping
rejections on. Baseline to beat: 4/5 reps over 17 kill cycles.
@changeset-bot

changeset-bot Bot commented Aug 3, 2026

Copy link
Copy Markdown

🦋 Changeset detected

Latest commit: 2fee67b

The changes in this PR will be included in the next version bump.

This PR includes changesets to release 8 packages
Name Type
miniflare Patch
@cloudflare/deploy-helpers Patch
@cloudflare/pages-shared Patch
@cloudflare/remote-bindings Patch
@cloudflare/runtime-types Patch
@cloudflare/vite-plugin Patch
@cloudflare/vitest-pool-workers Patch
wrangler Patch

Not sure what this means? Click here to learn what changesets are.

Click here if you're a maintainer who wants to add another changeset to this PR

@github-actions

github-actions Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

✅ All changesets look good

@pkg-pr-new

pkg-pr-new Bot commented Aug 3, 2026

Copy link
Copy Markdown
@cloudflare/autoconfig

npm i https://pkg.pr.new/@cloudflare/autoconfig@15006

@cloudflare/build-output-utils

npm i https://pkg.pr.new/@cloudflare/build-output-utils@15006

@cloudflare/config

npm i https://pkg.pr.new/@cloudflare/config@15006

create-cloudflare

npm i https://pkg.pr.new/create-cloudflare@15006

@cloudflare/deploy-helpers

npm i https://pkg.pr.new/@cloudflare/deploy-helpers@15006

@cloudflare/kv-asset-handler

npm i https://pkg.pr.new/@cloudflare/kv-asset-handler@15006

miniflare

npm i https://pkg.pr.new/miniflare@15006

@cloudflare/pages-functions

npm i https://pkg.pr.new/@cloudflare/pages-functions@15006

@cloudflare/pages-shared

npm i https://pkg.pr.new/@cloudflare/pages-shared@15006

@cloudflare/unenv-preset

npm i https://pkg.pr.new/@cloudflare/unenv-preset@15006

@cloudflare/vite-plugin

npm i https://pkg.pr.new/@cloudflare/vite-plugin@15006

@cloudflare/vitest-pool-workers

npm i https://pkg.pr.new/@cloudflare/vitest-pool-workers@15006

@cloudflare/workers-auth

npm i https://pkg.pr.new/@cloudflare/workers-auth@15006

@cloudflare/workers-editor-shared

npm i https://pkg.pr.new/@cloudflare/workers-editor-shared@15006

@cloudflare/workers-utils

npm i https://pkg.pr.new/@cloudflare/workers-utils@15006

wrangler

npm i https://pkg.pr.new/wrangler@15006

commit: 2fee67b

@ask-bonk

ask-bonk Bot commented Aug 3, 2026

Copy link
Copy Markdown
Contributor

@petebacondarwin Bonk workflow was cancelled.

View workflow run · To retry, trigger Bonk again.

@petebacondarwin

Copy link
Copy Markdown
Contributor Author

Answered: no. With #14993 applied, the crashing arm went 8/8 over 28 kill cycles (baseline without it was 4/5 over 17). No mitigation at all, so the unhandled tail rejection is not what aborts workerd.

The controls did reproduce exactly, in an independent run:

Peer killed Assets Bound Tail consumer round 8 (no fix) this run (with fix)
worker-entrypoint-with-assets yes yes yes 4/5 8/8
worker-entrypoint no yes no 0/3 0/3
exported-handler-with-assets yes no no 0/3 0/3

Combined: 12/13 for the one peer, 0/6 and 0/6 for the controls. The discriminator is solid; the cause is elsewhere. Closing this branch — #14993 stands on its own merits as a diagnostics fix, and the hunt continues in #15001.

@petebacondarwin
petebacondarwin deleted the exp/bisect-with-tail-fix branch August 4, 2026 10:17
@github-project-automation github-project-automation Bot moved this from Untriaged to Done in workers-sdk Aug 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

2 participants