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
NodeJS OOM crashes with Solid V2 when ssr: true #3003
I wonder why users/[id].tsx works, it doesn't have Loading, and it has Title. The blog/[slug].tsx is direct 'copy' of it but just with dummy blog posts.
Root cause was in Solid's SSR retry discovery, triggered by the combination in this app: <Title>/body reading a memo over the router's query(). For a cached key, query() returns a fresh derived promise object on every call — perfectly legal, but discovery relied on stamping settlement state onto the promise object itself, so no retry pass ever recognized the work as settled. The loop re-ran at microtask speed, allocating a new serialized deferred per pass until the heap died. (That's why users/[id] was fine — its <Title> is synchronous, so nothing ever suspends.)
The fix makes convergence independent of promise identity: the render context now keeps per-slot flight records keyed by owner id, so re-created slots adopt settled answers synchronously or join the in-flight deferred (one serialization per slot, and it settles even if the creating node was superseded — solid-meta's head registry re-pulls holes mid-flight, which previously could leave a serialized deferred dangling and hold the stream open). A retry budget also fails genuinely non-convergent boundaries loudly instead of OOMing.
Verified against this reproduction repo with ssr: true: /blog/asdfadsf and /blog/hello-solid now render correctly and close the stream in a few milliseconds. Thanks for the tight repro!
Activity
brenelz commentedon Aug 16, 2026
So this seems to be some kind of bug. If you add a Loading boundary in
[slug].tsxit seems to work.Ciantic commentedon Aug 17, 2026
I wonder why
users/[id].tsxworks, it doesn't have Loading, and it has Title. Theblog/[slug].tsxis direct 'copy' of it but just with dummy blog posts.brenelz commentedon Aug 17, 2026
Its becuase it doesn't have an async value in the title
<Title>{User ${props.params.id} - Solid App}</Title>fix(solid): converge SSR retry discovery for unstable promise identit…
ryansolid commentedon Aug 17, 2026
Fixed on
nextin 8366208.Root cause was in Solid's SSR retry discovery, triggered by the combination in this app:
<Title>/body reading a memo over the router'squery(). For a cached key,query()returns a fresh derived promise object on every call — perfectly legal, but discovery relied on stamping settlement state onto the promise object itself, so no retry pass ever recognized the work as settled. The loop re-ran at microtask speed, allocating a new serialized deferred per pass until the heap died. (That's whyusers/[id]was fine — its<Title>is synchronous, so nothing ever suspends.)The fix makes convergence independent of promise identity: the render context now keeps per-slot flight records keyed by owner id, so re-created slots adopt settled answers synchronously or join the in-flight deferred (one serialization per slot, and it settles even if the creating node was superseded — solid-meta's head registry re-pulls holes mid-flight, which previously could leave a serialized deferred dangling and hold the stream open). A retry budget also fails genuinely non-convergent boundaries loudly instead of OOMing.
Verified against this reproduction repo with
ssr: true:/blog/asdfadsfand/blog/hello-solidnow render correctly and close the stream in a few milliseconds. Thanks for the tight repro!Give server createProjection slot memory so pending body reads conver…