Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
[Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' [Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' [Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage
, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); [Fizz] Push halted await to the owner stack for late-arriving I/O info by unstubbable · Pull Request #35019 · react/react · GitHub
Skip to content

[Fizz] Push halted await to the owner stack for late-arriving I/O info - #35019

Merged
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack
Nov 1, 2025
Merged

[Fizz] Push halted await to the owner stack for late-arriving I/O info#35019
unstubbable merged 9 commits into
react:mainfrom
unstubbable:fix-push-halted-await-on-component-stack

Conversation

@unstubbable

@unstubbableunstubbable commented Oct 30, 2025

Copy link
Copy Markdown
Collaborator

To quote from #33634:

If an aborted task is not rendering, then this is an async abort. Conceptually it's as if the abort happened inside the async gap. The abort reason's stack frame won't have that on the stack so instead we use the owner stack and debug task of any halted async debug info.

This PR extends that logic to also try to resolve lazy components to find debug info that has been transferred to the inner value (same approach as in #34839).

In addition, we now ignore any time and component info that might follow the I/O info, effectively allowing resolved I/O to also be considered for the owner stack. This is useful in a scenario where the Flight rendering might have been completed (and not prematurely aborted), but then the Fizz rendering is intentionally aborted before all chunks were received, while still allowing the remaining chunks (including I/O info for halted components) to be processed while the prerender is in the aborting state.

An endTime option can be passed to the Flight client to indicate that all debug info that arrives after this time should be ignored. When rendering in Fizz is then aborted, the late-arriving debug info that's used to enhance the owner stack only includes I/O info up to that end time.

@github-actionsgithub-actionsBot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot

react-sizebot commented Oct 30, 2025

Copy link
Copy Markdown

Comparing: 488d88b...bd8ae71

Critical size changes

Includes critical production bundles, as well as any change greater than 2%:

Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable/react-dom/cjs/react-dom.production.js=6.68 kB6.68 kB=1.83 kB1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js=606.22 kB605.41 kB=107.38 kB107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js=6.69 kB6.69 kB=1.83 kB1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js=665.19 kB664.38 kB=117.26 kB117.09 kB
facebook-www/ReactDOM-prod.classic.js=689.06 kB688.25 kB=121.30 kB121.13 kB
facebook-www/ReactDOM-prod.modern.js=679.49 kB678.67 kB=119.69 kB119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name+/-BaseCurrent+/- gzipBase gzipCurrent gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.08%94.14 kB95.16 kB+1.12%19.26 kB19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js+1.07%94.93 kB95.94 kB+1.13%19.37 kB19.59 kB
test_utils/ReactAllWarnings.js+0.89%66.43 kB67.03 kB+0.87%16.72 kB16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.78%185.55 kB186.99 kB+0.76%32.47 kB32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js+0.77%186.42 kB187.87 kB+0.76%32.60 kB32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js+0.77%174.12 kB175.46 kB+0.79%30.26 kB30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js+0.77%174.14 kB175.48 kB+0.79%30.29 kB30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%187.25 kB188.69 kB+0.76%32.74 kB32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.74 kB180.11 kB+0.77%31.32 kB31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.77%178.79 kB180.16 kB+0.77%31.35 kB31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js+0.77%175.02 kB176.36 kB+0.78%30.44 kB30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js+0.77%188.13 kB189.57 kB+0.77%32.88 kB33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%179.36 kB180.73 kB+0.75%31.75 kB31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%188.66 kB190.10 kB+0.76%32.99 kB33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%188.68 kB190.13 kB+0.76%33.01 kB33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js+0.76%179.68 kB181.05 kB+0.76%31.49 kB31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js+0.76%189.54 kB190.98 kB+0.76%33.13 kB33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js+0.76%189.56 kB191.00 kB+0.76%33.15 kB33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js+0.76%180.27 kB181.64 kB+0.75%31.89 kB32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.70 kB182.07 kB+0.68%31.78 kB32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.76%180.75 kB182.12 kB+0.69%31.80 kB32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js+0.75%181.64 kB183.01 kB+0.67%31.95 kB32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%182.57 kB183.94 kB+0.74%32.25 kB32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%182.59 kB183.96 kB+0.74%32.27 kB32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.28 kB184.65 kB+0.64%32.26 kB32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.75%183.33 kB184.70 kB+0.65%32.28 kB32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js+0.75%183.48 kB184.85 kB+0.75%32.39 kB32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js+0.75%183.50 kB184.87 kB+0.74%32.41 kB32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.75%183.80 kB185.17 kB+0.71%32.40 kB32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.90 kB185.27 kB+0.64%32.43 kB32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%183.95 kB185.32 kB+0.63%32.45 kB32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js+0.74%184.21 kB185.58 kB+0.64%32.43 kB32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js+0.74%184.67 kB186.04 kB+0.70%32.55 kB32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js+0.74%184.84 kB186.21 kB+0.62%32.59 kB32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js+0.57%66.16 kB66.54 kB+0.33%11.95 kB11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js+0.57%66.19 kB66.57 kB+0.32%11.97 kB12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.57%57.89 kB58.21 kB+0.58%11.37 kB11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js+0.57%66.75 kB67.13 kB+0.27%12.09 kB12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.18 kB58.51 kB+0.54%11.45 kB11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js+0.56%58.49 kB58.82 kB+0.53%11.50 kB11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js+0.56%58.78 kB59.11 kB+0.51%11.57 kB11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.55%60.15 kB60.48 kB+0.49%11.85 kB11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%60.52 kB60.85 kB+0.48%11.94 kB11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js+0.54%60.75 kB61.08 kB+0.51%11.98 kB12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js+0.54%61.12 kB61.45 kB+0.51%12.06 kB12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.52%63.41 kB63.74 kB+0.40%12.60 kB12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js+0.51%64.01 kB64.34 kB+0.38%12.71 kB12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.06 kB226.19 kB+0.41%49.71 kB49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%225.08 kB226.22 kB+0.42%49.73 kB49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js+0.50%226.24 kB227.37 kB+0.42%49.92 kB50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%66.49 kB66.81 kB+0.42%13.20 kB13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%66.51 kB66.84 kB+0.39%13.21 kB13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%66.61 kB66.94 kB+0.45%12.95 kB13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js+0.49%67.09 kB67.42 kB+0.38%13.31 kB13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js+0.49%67.11 kB67.44 kB+0.38%13.33 kB13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js+0.49%67.25 kB67.57 kB+0.38%13.07 kB13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%67.77 kB68.10 kB+0.44%13.21 kB13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js+0.48%68.41 kB68.74 kB+0.40%13.34 kB13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%69.90 kB70.22 kB+0.37%13.63 kB13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js+0.47%70.53 kB70.86 kB+0.34%13.77 kB13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.05 kB71.38 kB+0.38%13.86 kB13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.07 kB71.40 kB+0.37%13.87 kB13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js+0.46%71.69 kB72.01 kB+0.36%14.00 kB14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js+0.46%71.71 kB72.04 kB+0.35%14.01 kB14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-stable/react-server/cjs/react-server.development.js+0.26%204.06 kB204.59 kB+0.24%35.97 kB36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js+0.23%675.29 kB676.85 kB+0.25%118.90 kB119.19 kB
oss-experimental/react-server/cjs/react-server.development.js+0.22%216.49 kB216.96 kB+0.13%37.50 kB37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js=447.57 kB446.67 kB=71.62 kB71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js=447.54 kB446.64 kB=71.59 kB71.43 kB
facebook-www/ReactART-prod.classic.js=389.88 kB389.10 kB=65.37 kB65.24 kB
react-native/implementations/ReactFabric-prod.fb.js=381.94 kB381.15 kB=66.23 kB66.11 kB
facebook-www/ReactART-prod.modern.js=380.04 kB379.26 kB=63.75 kB63.62 kB
react-native/implementations/ReactFabric-prod.js=377.17 kB376.39 kB=65.49 kB65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js=370.17 kB369.36 kB=63.43 kB63.29 kB
oss-experimental/react-art/cjs/react-art.production.js=354.88 kB354.09 kB=59.92 kB59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js=345.38 kB344.56 kB=60.06 kB59.93 kB
oss-stable/react-art/cjs/react-art.production.js=330.20 kB329.41 kB=55.98 kB55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js=330.13 kB329.34 kB=55.96 kB55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js=325.66 kB324.87 kB=56.73 kB56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js=325.49 kB324.70 kB=56.69 kB56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js=325.41 kB324.63 kB=56.67 kB56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from react#33634:
> If an aborted task is not rendering, then this is an async abort.
> Conceptually it's as if the abort happened inside the async gap. The
> abort reason's stack frame won't have that on the stack so instead we
> use the owner stack and debug task of any halted async debug info.
This PR extends that logic to also try to resolve lazy components to
find debug info that has been transferred to the inner value. In
addition, we ignore any time and component info that might precede the
I/O info, effectively allowing resolved I/O to also be considered for
the owner stack. This is useful in a scenario where the Flight rendering
might have been completed (and not prematurely aborted), but then the
Fizz rendering is intentionally aborted before all chunks were received,
while still allowing the remaining chunks (including I/O info for halted
components) to be processed while the prerender is in the aborting
state.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896bCompareOctober 30, 2025 14:51
Comment threadpackages/react-server/src/ReactFizzServer.js Outdated
@unstubbable
unstubbable marked this pull request as ready for review October 30, 2025 16:56
if (typeof info.time === 'number') {
// This had an end time. Any awaits before this must have already resolved.
break;
}

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This bit is not right. We can't just take the last entry that's resolved since that doesn't tell us about where it was aborted.

We need another solution to this (e.g. an end time in the flight client that avoids adding debug info after some time stamp).

@unstubbableunstubbableOct 30, 2025

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We're picking the first resolved entry. (I at least intended to do so, needs to be fixed!) My thinking was that this should point at the location where the I/O would have halted the component if we didn't render through fully. Any cached I/O that was awaited before wouldn't be emitted as I/O, so we shouldn't point at those lines.

Copy link
Copy Markdown
CollaboratorAuthor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I discussed your proposal with @eps1lon. Makes sense now, will implement that.

@unstubbable
unstubbable marked this pull request as draft October 30, 2025 20:42
Not really happy about calling the public option `endTime` instead of
`debugEndTime`, but this is following the `startTime`/`debugStartTime`
naming pattern.
That's too late though. We probably need to prevent adding the debug info in the first place.
This reverts commit 665c671b0b87640d1fc52c39eb4aec4f5b0c72ee.
@unstubbable
unstubbableforce-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71CompareNovember 1, 2025 09:14
@unstubbable
unstubbable marked this pull request as ready for review November 1, 2025 09:20
@unstubbable
unstubbable merged commit 561ee24 into react:mainNov 1, 2025
243 checks passed
github-actionsBot pushed a commit that referenced this pull request Nov 1, 2025
github-actionsBot pushed a commit to code/lib-react that referenced this pull request Nov 2, 2025
unstubbable added a commit to unstubbable/react that referenced this pull request Nov 3, 2025
In react#35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
unstubbable added a commit that referenced this pull request Nov 3, 2025
In #35019, we excluded debug I/O info from being considered for
enhancing the owner stack if it resolved after the defined `endTime`
option that can be passed to the Flight client. However, we should
include any I/O that was awaited before that end time, even if it
resolved later.
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA SignedReact Core TeamOpened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants

@unstubbable@react-sizebot@sebmarkbage