Skip to content

Conversation

@unstubbable
Copy link
Collaborator

@unstubbable unstubbable commented Oct 30, 2025

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.

@meta-cla meta-cla bot added the CLA Signed label Oct 30, 2025
@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Oct 30, 2025
@react-sizebot
Copy link

react-sizebot commented Oct 30, 2025

Comparing: 488d88b...bd8ae71

Critical size changes

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

Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable/react-dom/cjs/react-dom.production.js = 6.68 kB 6.68 kB = 1.83 kB 1.83 kB
oss-stable/react-dom/cjs/react-dom-client.production.js = 606.22 kB 605.41 kB = 107.38 kB 107.21 kB
oss-experimental/react-dom/cjs/react-dom.production.js = 6.69 kB 6.69 kB = 1.83 kB 1.83 kB
oss-experimental/react-dom/cjs/react-dom-client.production.js = 665.19 kB 664.38 kB = 117.26 kB 117.09 kB
facebook-www/ReactDOM-prod.classic.js = 689.06 kB 688.25 kB = 121.30 kB 121.13 kB
facebook-www/ReactDOM-prod.modern.js = 679.49 kB 678.67 kB = 119.69 kB 119.48 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +1.08% 94.14 kB 95.16 kB +1.12% 19.26 kB 19.47 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +1.08% 94.14 kB 95.16 kB +1.12% 19.26 kB 19.47 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +1.07% 94.93 kB 95.94 kB +1.13% 19.37 kB 19.59 kB
test_utils/ReactAllWarnings.js +0.89% 66.43 kB 67.03 kB +0.87% 16.72 kB 16.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +0.78% 185.55 kB 186.99 kB +0.76% 32.47 kB 32.71 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +0.78% 185.55 kB 186.99 kB +0.76% 32.47 kB 32.71 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +0.77% 186.42 kB 187.87 kB +0.76% 32.60 kB 32.85 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +0.77% 174.12 kB 175.46 kB +0.79% 30.26 kB 30.50 kB
oss-stable/react-client/cjs/react-client-flight.development.js +0.77% 174.14 kB 175.48 kB +0.79% 30.29 kB 30.52 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.77% 187.25 kB 188.69 kB +0.76% 32.74 kB 32.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.77% 187.25 kB 188.69 kB +0.76% 32.74 kB 32.99 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +0.77% 178.74 kB 180.11 kB +0.77% 31.32 kB 31.57 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +0.77% 178.79 kB 180.16 kB +0.77% 31.35 kB 31.59 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +0.77% 175.02 kB 176.36 kB +0.78% 30.44 kB 30.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +0.77% 188.13 kB 189.57 kB +0.77% 32.88 kB 33.13 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +0.76% 179.36 kB 180.73 kB +0.75% 31.75 kB 31.99 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +0.76% 179.36 kB 180.73 kB +0.75% 31.75 kB 31.99 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.76% 188.66 kB 190.10 kB +0.76% 32.99 kB 33.24 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.76% 188.66 kB 190.10 kB +0.76% 32.99 kB 33.24 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.76% 188.68 kB 190.13 kB +0.76% 33.01 kB 33.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.76% 188.68 kB 190.13 kB +0.76% 33.01 kB 33.26 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +0.76% 179.68 kB 181.05 kB +0.76% 31.49 kB 31.73 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +0.76% 189.54 kB 190.98 kB +0.76% 33.13 kB 33.39 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +0.76% 189.56 kB 191.00 kB +0.76% 33.15 kB 33.40 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +0.76% 180.27 kB 181.64 kB +0.75% 31.89 kB 32.13 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.76% 180.70 kB 182.07 kB +0.68% 31.78 kB 32.00 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.76% 180.75 kB 182.12 kB +0.69% 31.80 kB 32.02 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +0.75% 181.64 kB 183.01 kB +0.67% 31.95 kB 32.16 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.75% 182.57 kB 183.94 kB +0.74% 32.25 kB 32.49 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.75% 182.57 kB 183.94 kB +0.74% 32.25 kB 32.49 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.75% 182.59 kB 183.96 kB +0.74% 32.27 kB 32.51 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.75% 182.59 kB 183.96 kB +0.74% 32.27 kB 32.51 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.75% 183.28 kB 184.65 kB +0.64% 32.26 kB 32.47 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.75% 183.33 kB 184.70 kB +0.65% 32.28 kB 32.49 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +0.75% 183.48 kB 184.85 kB +0.75% 32.39 kB 32.63 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +0.75% 183.50 kB 184.87 kB +0.74% 32.41 kB 32.65 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.75% 183.80 kB 185.17 kB +0.71% 32.40 kB 32.63 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.75% 183.80 kB 185.17 kB +0.71% 32.40 kB 32.63 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.74% 183.90 kB 185.27 kB +0.64% 32.43 kB 32.63 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.74% 183.95 kB 185.32 kB +0.63% 32.45 kB 32.66 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +0.74% 184.21 kB 185.58 kB +0.64% 32.43 kB 32.63 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +0.74% 184.67 kB 186.04 kB +0.70% 32.55 kB 32.77 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +0.74% 184.84 kB 186.21 kB +0.62% 32.59 kB 32.80 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js +0.57% 66.16 kB 66.54 kB +0.33% 11.95 kB 11.99 kB
oss-stable/react-client/cjs/react-client-flight.production.js +0.57% 66.19 kB 66.57 kB +0.32% 11.97 kB 12.01 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js +0.57% 57.89 kB 58.21 kB +0.58% 11.37 kB 11.44 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js +0.57% 57.89 kB 58.21 kB +0.58% 11.37 kB 11.44 kB
oss-experimental/react-client/cjs/react-client-flight.production.js +0.57% 66.75 kB 67.13 kB +0.27% 12.09 kB 12.12 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.56% 58.18 kB 58.51 kB +0.54% 11.45 kB 11.51 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.56% 58.18 kB 58.51 kB +0.54% 11.45 kB 11.51 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js +0.56% 58.49 kB 58.82 kB +0.53% 11.50 kB 11.56 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.56% 58.78 kB 59.11 kB +0.51% 11.57 kB 11.63 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.55% 60.15 kB 60.48 kB +0.49% 11.85 kB 11.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.55% 60.15 kB 60.48 kB +0.49% 11.85 kB 11.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.54% 60.52 kB 60.85 kB +0.48% 11.94 kB 11.99 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.54% 60.52 kB 60.85 kB +0.48% 11.94 kB 11.99 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.54% 60.75 kB 61.08 kB +0.51% 11.98 kB 12.04 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.54% 61.12 kB 61.45 kB +0.51% 12.06 kB 12.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js +0.52% 63.41 kB 63.74 kB +0.40% 12.60 kB 12.65 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js +0.52% 63.41 kB 63.74 kB +0.40% 12.60 kB 12.65 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js +0.51% 64.01 kB 64.34 kB +0.38% 12.71 kB 12.76 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.50% 225.06 kB 226.19 kB +0.41% 49.71 kB 49.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.50% 225.08 kB 226.22 kB +0.42% 49.73 kB 49.94 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +0.50% 226.24 kB 227.37 kB +0.42% 49.92 kB 50.13 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +0.49% 66.49 kB 66.81 kB +0.42% 13.20 kB 13.25 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +0.49% 66.49 kB 66.81 kB +0.42% 13.20 kB 13.25 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +0.49% 66.51 kB 66.84 kB +0.39% 13.21 kB 13.26 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +0.49% 66.51 kB 66.84 kB +0.39% 13.21 kB 13.26 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +0.49% 66.61 kB 66.94 kB +0.45% 12.95 kB 13.01 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +0.49% 66.61 kB 66.94 kB +0.45% 12.95 kB 13.01 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.production.js +0.49% 67.09 kB 67.42 kB +0.38% 13.31 kB 13.37 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.production.js +0.49% 67.11 kB 67.44 kB +0.38% 13.33 kB 13.38 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.production.js +0.49% 67.25 kB 67.57 kB +0.38% 13.07 kB 13.12 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js +0.48% 67.77 kB 68.10 kB +0.44% 13.21 kB 13.27 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js +0.48% 67.77 kB 68.10 kB +0.44% 13.21 kB 13.27 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js +0.48% 68.41 kB 68.74 kB +0.40% 13.34 kB 13.40 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.47% 69.90 kB 70.22 kB +0.37% 13.63 kB 13.68 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.47% 69.90 kB 70.22 kB +0.37% 13.63 kB 13.68 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.47% 70.53 kB 70.86 kB +0.34% 13.77 kB 13.81 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.46% 71.05 kB 71.38 kB +0.38% 13.86 kB 13.91 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.46% 71.05 kB 71.38 kB +0.38% 13.86 kB 13.91 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.46% 71.07 kB 71.40 kB +0.37% 13.87 kB 13.93 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.46% 71.07 kB 71.40 kB +0.37% 13.87 kB 13.93 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.46% 71.69 kB 72.01 kB +0.36% 14.00 kB 14.05 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.46% 71.71 kB 72.04 kB +0.35% 14.01 kB 14.06 kB
oss-stable-semver/react-server/cjs/react-server.development.js +0.26% 204.06 kB 204.59 kB +0.24% 35.97 kB 36.06 kB
oss-stable/react-server/cjs/react-server.development.js +0.26% 204.06 kB 204.59 kB +0.24% 35.97 kB 36.06 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js +0.23% 675.29 kB 676.85 kB +0.25% 118.90 kB 119.19 kB
oss-experimental/react-server/cjs/react-server.development.js +0.22% 216.49 kB 216.96 kB +0.13% 37.50 kB 37.55 kB
oss-stable/react-reconciler/cjs/react-reconciler.production.js = 447.57 kB 446.67 kB = 71.62 kB 71.45 kB
oss-stable-semver/react-reconciler/cjs/react-reconciler.production.js = 447.54 kB 446.64 kB = 71.59 kB 71.43 kB
facebook-www/ReactART-prod.classic.js = 389.88 kB 389.10 kB = 65.37 kB 65.24 kB
react-native/implementations/ReactFabric-prod.fb.js = 381.94 kB 381.15 kB = 66.23 kB 66.11 kB
facebook-www/ReactART-prod.modern.js = 380.04 kB 379.26 kB = 63.75 kB 63.62 kB
react-native/implementations/ReactFabric-prod.js = 377.17 kB 376.39 kB = 65.49 kB 65.35 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-profiling.js = 370.17 kB 369.36 kB = 63.43 kB 63.29 kB
oss-experimental/react-art/cjs/react-art.production.js = 354.88 kB 354.09 kB = 59.92 kB 59.80 kB
facebook-react-native/react-test-renderer/cjs/ReactTestRenderer-prod.js = 345.38 kB 344.56 kB = 60.06 kB 59.93 kB
oss-stable/react-art/cjs/react-art.production.js = 330.20 kB 329.41 kB = 55.98 kB 55.84 kB
oss-stable-semver/react-art/cjs/react-art.production.js = 330.13 kB 329.34 kB = 55.96 kB 55.82 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.js = 325.66 kB 324.87 kB = 56.73 kB 56.60 kB
oss-stable/react-test-renderer/cjs/react-test-renderer.production.js = 325.49 kB 324.70 kB = 56.69 kB 56.55 kB
oss-stable-semver/react-test-renderer/cjs/react-test-renderer.production.js = 325.41 kB 324.63 kB = 56.67 kB 56.53 kB

Generated by 🚫 dangerJS against bd8ae71

To quote from facebook#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 unstubbable force-pushed the fix-push-halted-await-on-component-stack branch from 5d467bc to 64c896b Compare October 30, 2025 14:51
@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
Collaborator

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).

Copy link
Collaborator Author

@unstubbable unstubbable Oct 30, 2025

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
Collaborator Author

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 unstubbable force-pushed the fix-push-halted-await-on-component-stack branch from 45bfa94 to bd8ae71 Compare November 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 facebook:main Nov 1, 2025
243 checks passed
github-actions bot pushed a commit that referenced this pull request Nov 1, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

CLA Signed React Core Team Opened by a member of the React Core Team

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants