Skip to content

[Flight] Clarify Semantics for Awaiting Cached Data #33438

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 6 commits into from
Jun 7, 2025

Conversation

sebmarkbage
Copy link
Collaborator

Technically the async call graph spans basically all the way back to the start of the app potentially, but we don't want to include everything. Similarly we don't want to include everything from previous components in every child component. So we need some heuristics for filtering out data.

We roughly want to be able to inspect is what might contribute to a Suspense loading sequence even if it didn't this time e.g. due to a race condition.

One flaw with the previous approach was that awaiting a cached promise in a sibling that happened to finish after another sibling would be excluded. However, in a different race condition that might end up being used so I wanted to include an empty "await" in that scenario to have some association from that component.

However, for data that resolved fully before the request even started, it's a little different. This can be things that are part of the start up sequence of the app or externally cached data. We decided that this should be excluded because it doesn't contribute to the loading sequence in the expected scenario. I.e. if it's cached. Things that end up being cache misses would still be included. If you want to test externally cached data misses, then it's up to you or the framework to simulate those. E.g. by dropping the cache. This also helps free up some noise since static / cached data can be excluded in visualizations.

I also apply this principle to forwarding debug info. If you reuse a cached RSC payload, then the Server Component render time and its awaits gets clamped to the caller as if it has zero render/await time. The I/O entry is still back dated but if it was fully resolved before we started then it's completely excluded.

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

react-sizebot commented Jun 4, 2025

Comparing: b367b60...c19e900

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.07 kB 530.07 kB = 93.57 kB 93.57 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 = 651.16 kB 651.16 kB = 114.70 kB 114.70 kB
facebook-www/ReactDOM-prod.classic.js = 676.11 kB 676.11 kB = 118.97 kB 118.97 kB
facebook-www/ReactDOM-prod.modern.js = 666.39 kB 666.39 kB = 117.36 kB 117.36 kB

Significant size changes

Includes any change greater than 0.2%:

Expand to show
Name +/- Base Current +/- gzip Base gzip Current gzip
oss-experimental/react-server/cjs/react-server-flight.development.js +0.85% 115.67 kB 116.65 kB +0.74% 21.40 kB 21.56 kB
oss-stable-semver/react-server/cjs/react-server-flight.development.js +0.78% 108.61 kB 109.46 kB +0.54% 20.16 kB 20.27 kB
oss-stable/react-server/cjs/react-server-flight.development.js +0.78% 108.61 kB 109.46 kB +0.54% 20.16 kB 20.27 kB
oss-experimental/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.64% 168.53 kB 169.60 kB +0.54% 31.44 kB 31.61 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.63% 154.57 kB 155.55 kB +0.61% 28.62 kB 28.79 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.62% 173.19 kB 174.27 kB +0.49% 31.91 kB 32.06 kB
oss-experimental/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.62% 158.49 kB 159.47 kB +0.57% 29.16 kB 29.32 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.60% 162.31 kB 163.29 kB +0.58% 29.98 kB 30.15 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.60% 162.86 kB 163.84 kB +0.58% 30.10 kB 30.28 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.60% 179.93 kB 181.00 kB +0.49% 32.97 kB 33.13 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.59% 181.08 kB 182.15 kB +0.50% 33.25 kB 33.42 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.59% 181.14 kB 182.21 kB +0.50% 33.26 kB 33.43 kB
oss-experimental/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.59% 166.24 kB 167.22 kB +0.56% 30.53 kB 30.70 kB
oss-experimental/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.59% 166.27 kB 167.25 kB +0.57% 30.52 kB 30.70 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.57% 147.50 kB 148.34 kB +0.51% 27.37 kB 27.51 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.browser.development.js +0.57% 147.50 kB 148.34 kB +0.51% 27.37 kB 27.51 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.56% 151.07 kB 151.91 kB +0.46% 27.89 kB 28.02 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.edge.development.js +0.56% 151.07 kB 151.91 kB +0.46% 27.89 kB 28.02 kB
oss-stable-semver/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.56% 151.87 kB 152.71 kB +0.49% 28.22 kB 28.36 kB
oss-stable/react-server-dom-esm/cjs/react-server-dom-esm-server.node.development.js +0.56% 151.87 kB 152.71 kB +0.49% 28.22 kB 28.36 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.54% 155.24 kB 156.08 kB +0.54% 28.71 kB 28.87 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.browser.development.js +0.54% 155.24 kB 156.08 kB +0.54% 28.71 kB 28.87 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.54% 155.78 kB 156.63 kB +0.55% 28.84 kB 29.00 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.browser.development.js +0.54% 155.78 kB 156.63 kB +0.55% 28.84 kB 29.00 kB
oss-stable-semver/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.54% 156.53 kB 157.38 kB +0.42% 28.70 kB 28.82 kB
oss-stable/react-server-dom-parcel/cjs/react-server-dom-parcel-server.node.development.js +0.54% 156.53 kB 157.38 kB +0.42% 28.70 kB 28.82 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.53% 158.82 kB 159.66 kB +0.47% 29.24 kB 29.37 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.edge.development.js +0.53% 158.82 kB 159.66 kB +0.47% 29.24 kB 29.37 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.53% 158.84 kB 159.69 kB +0.47% 29.23 kB 29.37 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.edge.development.js +0.53% 158.84 kB 159.69 kB +0.47% 29.23 kB 29.37 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.52% 163.27 kB 164.12 kB +0.44% 29.76 kB 29.89 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.unbundled.development.js +0.52% 163.27 kB 164.12 kB +0.44% 29.76 kB 29.89 kB
oss-stable-semver/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.51% 164.42 kB 165.27 kB +0.44% 30.03 kB 30.16 kB
oss-stable/react-server-dom-turbopack/cjs/react-server-dom-turbopack-server.node.development.js +0.51% 164.42 kB 165.27 kB +0.44% 30.03 kB 30.16 kB
oss-stable-semver/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.51% 164.47 kB 165.32 kB +0.46% 30.04 kB 30.18 kB
oss-stable/react-server-dom-webpack/cjs/react-server-dom-webpack-server.node.development.js +0.51% 164.47 kB 165.32 kB +0.46% 30.04 kB 30.18 kB

Generated by 🚫 dangerJS against c19e900

unstubbable added a commit to unstubbable/react that referenced this pull request Jun 5, 2025
This should allow us to visualize what facebook#33438 is trying to convey.
unstubbable added a commit to unstubbable/react that referenced this pull request Jun 5, 2025
This should allow us to visualize what facebook#33438 is trying to convey.
unstubbable added a commit that referenced this pull request Jun 5, 2025
This should allow us to visualize what
#33438 is trying to convey.

An uncached 3rd-party component is displayed like this in the dev tools:

<img width="1072" alt="Screenshot 2025-06-05 at 12 57 32"
src="https://github.com/user-attachments/assets/d418ae23-d113-4dc9-98b8-ab426710454a"
/>

However, when the component is restored from a cache, it looks like
this:

<img width="1072" alt="Screenshot 2025-06-05 at 12 56 56"
src="https://github.com/user-attachments/assets/a0e34379-d8c0-4b14-8b54-b5c06211232b"
/>

The `Server Components ⚛` track is missing completely here, and the
`Loading profile...` phase also took way longer than without caching the
3rd-party component.

On `main`, the `Server Components ⚛` track is not missing:

<img width="1072" alt="Screenshot 2025-06-05 at 14 31 20"
src="https://github.com/user-attachments/assets/c35e405d-27ca-4b04-a34c-03bd959a7687"
/>

The cached 3rd-party component starts before the current render, and is
also not excluded here, which is of course expected without #33438.
@sebmarkbage sebmarkbage force-pushed the ioexclusion branch 2 times, most recently from 505f98c to 2d40d8c Compare June 7, 2025 05:18
Copy link
Collaborator

@unstubbable unstubbable left a comment

Choose a reason for hiding this comment

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

Do you intend to fix the issue of the missing Server Components ⚛ track that's introduced here (reported in #33443) as part of this PR?

@sebmarkbage
Copy link
Collaborator Author

Do you intend to fix the issue of the missing Server Components ⚛ track that's introduced here (reported in #33443) as part of this PR?

Yea I'm still looking into it.

@sebmarkbage sebmarkbage force-pushed the ioexclusion branch 2 times, most recently from 4ce29ea to 78f7790 Compare June 7, 2025 15:25
We don't really need the ID here. It's the same as the task id. We pass
the task instead. It's really just used as a flag.

Update comments

Update comments
…mponent

We also ignore any await entries that finished before the request started since they're irrelevant to the loading sequence.
} else {
request.pendingChunks++;
Copy link
Collaborator Author

Choose a reason for hiding this comment

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

@unstubbable The bug was that this was now mismatched since one of the branches doesn't emit a chunk. We should really move all these into the emit functions.

Copy link
Collaborator

Choose a reason for hiding this comment

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

Yeah, it's not the first time that managing this counter has caused a bug.

@sebmarkbage sebmarkbage merged commit 6c8bcda into facebook:main Jun 7, 2025
241 checks passed
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