Skip to content

[Flight] Close Debug Channel when All Lazy References Have Been GC:ed #33718

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 7, 2025

Conversation

sebmarkbage
Copy link
Collaborator

When we have a debug channel open that can ask for more objects. That doesn't close until all lazy objects have been explicitly asked for. If you GC an object before the lazy references inside of it before asking for or releasing the objects, then it'll never close.

This ensures that if there are no more PendingChunk and no more ResolvedModelChunk then we can close the connection.

There's two sources of retaining the Response object. On one side we have a handle to it from the stream coming from the server. On the other side we have a handle to it from ResolvedModelChunk to ask for more data when we lazily parse a model.

This PR makes a weak handle from the stream to the Response. However, it keeps a strong reference alive whenever we're waiting on a pending chunk because then the stream might be the root if the only listeners are the callbacks passed to the promise and no references to the promise itself.

The pending chunks count can end up being zero even if we might get more data because the references might be inside lazy chunks. In this case the lazy chunks keeps the Response alive. When the lazy chunk gets parsed it can find more chunks that then end up pending to keep the response strongly alive until they resolve.

@github-actions github-actions bot added the React Core Team Opened by a member of the React Core Team label Jul 7, 2025
@react-sizebot
Copy link

Comparing: 9a645e1...43a5dcd

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 = 530.50 kB 530.50 kB = 93.66 kB 93.66 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 = 655.04 kB 655.04 kB = 115.35 kB 115.35 kB
facebook-www/ReactDOM-prod.classic.js = 675.12 kB 675.12 kB = 118.77 kB 118.77 kB
facebook-www/ReactDOM-prod.modern.js = 665.54 kB 665.54 kB = 117.13 kB 117.13 kB
oss-stable-semver/react-client/cjs/react-client-flight.development.js +2.52% 107.96 kB 110.68 kB +1.82% 19.63 kB 19.99 kB
oss-stable/react-client/cjs/react-client-flight.development.js +2.52% 107.99 kB 110.71 kB +1.81% 19.66 kB 20.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.33% 118.74 kB 121.51 kB +2.09% 21.86 kB 22.31 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.33% 118.74 kB 121.51 kB +2.09% 21.86 kB 22.31 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.30% 120.07 kB 122.84 kB +2.04% 22.11 kB 22.56 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.30% 120.07 kB 122.84 kB +2.04% 22.11 kB 22.56 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.21% 110.91 kB 113.37 kB +1.88% 20.68 kB 21.06 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.21% 110.91 kB 113.37 kB +1.88% 20.68 kB 21.06 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +2.18% 113.46 kB 115.93 kB +1.90% 21.13 kB 21.53 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +2.18% 113.46 kB 115.93 kB +1.90% 21.13 kB 21.53 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +2.08% 107.97 kB 110.22 kB +1.93% 20.00 kB 20.38 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +2.08% 108.02 kB 110.27 kB +1.93% 20.02 kB 20.41 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.08% 116.39 kB 118.80 kB +1.79% 21.63 kB 22.02 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.08% 116.39 kB 118.80 kB +1.79% 21.63 kB 22.02 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +2.07% 106.87 kB 109.08 kB +1.84% 19.95 kB 20.31 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +2.07% 106.92 kB 109.13 kB +1.84% 19.97 kB 20.34 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +2.04% 147.58 kB 150.59 kB +2.23% 34.15 kB 34.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +2.04% 147.61 kB 150.61 kB +2.22% 34.18 kB 34.94 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +2.03% 109.05 kB 111.26 kB +1.83% 20.34 kB 20.71 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +2.03% 109.10 kB 111.31 kB +1.83% 20.36 kB 20.73 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.02% 109.61 kB 111.82 kB +1.81% 20.47 kB 20.84 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.02% 109.66 kB 111.87 kB +1.81% 20.50 kB 20.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +2.01% 112.20 kB 114.46 kB +1.64% 21.00 kB 21.35 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +2.01% 112.20 kB 114.46 kB +1.64% 21.00 kB 21.35 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-client/cjs/react-client-flight.development.js +2.52% 107.96 kB 110.68 kB +1.82% 19.63 kB 19.99 kB
oss-stable/react-client/cjs/react-client-flight.development.js +2.52% 107.99 kB 110.71 kB +1.81% 19.66 kB 20.01 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.33% 118.74 kB 121.51 kB +2.09% 21.86 kB 22.31 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +2.33% 118.74 kB 121.51 kB +2.09% 21.86 kB 22.31 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.30% 120.07 kB 122.84 kB +2.04% 22.11 kB 22.56 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +2.30% 120.07 kB 122.84 kB +2.04% 22.11 kB 22.56 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.21% 110.91 kB 113.37 kB +1.88% 20.68 kB 21.06 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +2.21% 110.91 kB 113.37 kB +1.88% 20.68 kB 21.06 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +2.18% 113.46 kB 115.93 kB +1.90% 21.13 kB 21.53 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +2.18% 113.46 kB 115.93 kB +1.90% 21.13 kB 21.53 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +2.08% 107.97 kB 110.22 kB +1.93% 20.00 kB 20.38 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +2.08% 108.02 kB 110.27 kB +1.93% 20.02 kB 20.41 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.08% 116.39 kB 118.80 kB +1.79% 21.63 kB 22.02 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +2.08% 116.39 kB 118.80 kB +1.79% 21.63 kB 22.02 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +2.07% 106.87 kB 109.08 kB +1.84% 19.95 kB 20.31 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +2.07% 106.92 kB 109.13 kB +1.84% 19.97 kB 20.34 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +2.04% 147.58 kB 150.59 kB +2.23% 34.15 kB 34.91 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +2.04% 147.61 kB 150.61 kB +2.22% 34.18 kB 34.94 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +2.03% 109.05 kB 111.26 kB +1.83% 20.34 kB 20.71 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +2.03% 109.10 kB 111.31 kB +1.83% 20.36 kB 20.73 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.02% 109.61 kB 111.82 kB +1.81% 20.47 kB 20.84 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +2.02% 109.66 kB 111.87 kB +1.81% 20.50 kB 20.87 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +2.01% 112.20 kB 114.46 kB +1.64% 21.00 kB 21.35 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +2.01% 112.20 kB 114.46 kB +1.64% 21.00 kB 21.35 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +1.91% 115.30 kB 117.50 kB +1.56% 21.48 kB 21.81 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +1.91% 115.30 kB 117.50 kB +1.56% 21.48 kB 21.81 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +1.91% 115.39 kB 117.59 kB +1.57% 21.51 kB 21.85 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +1.91% 115.39 kB 117.59 kB +1.57% 21.51 kB 21.85 kB
oss-experimental/react-client/cjs/react-client-flight.development.js +1.82% 150.33 kB 153.07 kB +1.50% 26.43 kB 26.82 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.development.js +1.73% 161.07 kB 163.86 kB +1.54% 28.70 kB 29.14 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.development.js +1.72% 162.40 kB 165.19 kB +1.56% 28.94 kB 29.39 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.development.js +1.64% 184.25 kB 187.27 kB +1.93% 41.08 kB 41.87 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.node.development.js +1.61% 153.25 kB 155.72 kB +1.48% 27.49 kB 27.90 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.development.js +1.60% 155.79 kB 158.28 kB +1.57% 27.92 kB 28.36 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.development.js +1.53% 158.72 kB 161.15 kB +1.36% 28.46 kB 28.85 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.development.js +1.51% 150.37 kB 152.64 kB +1.45% 26.78 kB 27.17 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.development.js +1.50% 149.26 kB 151.49 kB +1.28% 26.80 kB 27.14 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.development.js +1.47% 151.45 kB 153.68 kB +1.28% 27.18 kB 27.53 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.development.js +1.47% 154.54 kB 156.81 kB +1.45% 27.84 kB 28.24 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.development.js +1.47% 152.00 kB 154.24 kB +1.26% 27.34 kB 27.68 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.edge.development.js +1.41% 157.63 kB 159.85 kB +1.26% 28.35 kB 28.71 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.edge.development.js +1.41% 157.72 kB 159.94 kB +1.27% 28.39 kB 28.75 kB
oss-experimental/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +0.66% 89.24 kB 89.84 kB +0.61% 18.50 kB 18.62 kB
oss-stable-semver/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +0.66% 88.51 kB 89.10 kB +0.61% 18.38 kB 18.50 kB
oss-stable/react-server-dom-esm/esm/react-server-dom-esm-client.browser.production.js +0.66% 88.51 kB 89.10 kB +0.61% 18.38 kB 18.50 kB
oss-stable-semver/react-client/cjs/react-client-flight.production.js +0.41% 63.02 kB 63.28 kB +0.49% 11.52 kB 11.58 kB
oss-stable/react-client/cjs/react-client-flight.production.js +0.41% 63.04 kB 63.30 kB +0.49% 11.54 kB 11.60 kB
oss-experimental/react-client/cjs/react-client-flight.production.js +0.40% 63.53 kB 63.79 kB +0.48% 11.63 kB 11.68 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js +0.34% 61.96 kB 62.17 kB +0.44% 12.37 kB 12.43 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js +0.34% 61.39 kB 61.60 kB +0.42% 12.28 kB 12.33 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.node.production.js +0.34% 61.39 kB 61.60 kB +0.42% 12.28 kB 12.33 kB
oss-experimental/react-markup/cjs/react-markup.react-server.development.js +0.32% 638.35 kB 640.42 kB +0.33% 112.90 kB 113.28 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.26% 66.74 kB 66.92 kB +0.49% 13.16 kB 13.22 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.26% 66.74 kB 66.92 kB +0.49% 13.16 kB 13.22 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.26% 65.18 kB 65.35 kB +0.40% 13.01 kB 13.06 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.26% 64.61 kB 64.77 kB +0.36% 12.92 kB 12.97 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.node.production.js +0.26% 64.61 kB 64.77 kB +0.36% 12.92 kB 12.97 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.26% 67.92 kB 68.09 kB +0.49% 13.40 kB 13.47 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.26% 67.92 kB 68.09 kB +0.49% 13.40 kB 13.47 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js +0.26% 61.30 kB 61.46 kB +0.35% 12.29 kB 12.33 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js +0.25% 60.73 kB 60.88 kB +0.30% 12.20 kB 12.24 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.edge.production.js +0.25% 60.73 kB 60.88 kB +0.30% 12.20 kB 12.24 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.unbundled.production.js +0.25% 67.30 kB 67.47 kB +0.51% 13.26 kB 13.33 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.node.production.js +0.25% 68.48 kB 68.65 kB +0.50% 13.50 kB 13.57 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js +0.23% 55.91 kB 56.04 kB +0.47% 11.07 kB 11.12 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.22% 56.13 kB 56.25 kB +0.43% 11.16 kB 11.21 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js +0.22% 55.34 kB 55.46 kB +0.40% 10.98 kB 11.02 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-client.browser.production.js +0.22% 55.34 kB 55.46 kB +0.40% 10.98 kB 11.02 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.22% 55.56 kB 55.68 kB +0.42% 11.07 kB 11.11 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-client.browser.production.js +0.22% 55.56 kB 55.68 kB +0.42% 11.07 kB 11.11 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.22% 58.04 kB 58.16 kB +0.43% 11.55 kB 11.60 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.22% 58.47 kB 58.60 kB +0.42% 11.65 kB 11.70 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.21% 57.47 kB 57.59 kB +0.40% 11.46 kB 11.51 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-client.browser.production.js +0.21% 57.47 kB 57.59 kB +0.40% 11.46 kB 11.51 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.21% 57.90 kB 58.02 kB +0.38% 11.56 kB 11.60 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-client.browser.production.js +0.21% 57.90 kB 58.02 kB +0.38% 11.56 kB 11.60 kB

Generated by 🚫 dangerJS against 43a5dcd

@sebmarkbage sebmarkbage merged commit 7cafeff into facebook:main Jul 7, 2025
241 checks passed
sebmarkbage added a commit that referenced this pull request Jul 7, 2025
…33719)

Stacked on #33718. Alternative to #33716.

The issue with flushing the Server Components track in its current form
is that we need to decide how long to wait before flushing whatever we
have. That's because the root's end time will be determined by the end
time of that last child.

However, if a child isn't actually used then we don't necessarily need
to include it in the Server Components track since it wasn't blocking
the initial render.

This waits for 100ms after the last pending chunk is resolved and if
nothing is invoking any more lazy initializers after that then we log
the Server Components track with the information we have at that point.
We also don't eagerly initialize any chunks that wasn't already
initialized so if nothing was rendered, then nothing will be logged.

This is somewhat an artifact of the current visualization. If we did
another transposed form we wouldn't necessarily need to wait until the
end and can log things as they're discovered.
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.

4 participants