Skip to content
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

Track suspended time when the render doesn't commit because it suspended #31552

Merged
merged 2 commits into from
Nov 19, 2024

Conversation

sebmarkbage
Copy link
Collaborator

When we suspend the render with delay, we won't do any more work until we get some kind of another update/ping. It's because conceptually something is suspended and then will update later. We need to highlight this period to show why it's not doing any work. We fill the empty space with "Suspended". This stops whenever the same lane group starts rendering again. Clamped by the preceeding start time/event time/update time.

Screenshot 2024-11-15 at 1 01 29 PM

Ideally we would instead start the next render and suspend the work loop at all places we suspend. In that mode this will instead show up as a very long "Render" with a "Suspended" period instead highlighted in the Components track as one component is suspended. We'll soon have that for use() but not all updates so this covers the rest.

One issue with useActionState is that it is implemented as suspending at the point of the useActionState which means that the period of the Action shows up as a suspended render instead of as an Action which happens for raw actions. This is not really how you conceptually think about it so we need some special case for useActionState. In the screenshot above, the first "Suspended" is actually awaiting an Action and the second "Suspended" is awaiting the data from it.

This stops whenever the same lane group starts rendering again.
Clamped by the preceeding start time/event time/update time.
Copy link

vercel bot commented Nov 15, 2024

The latest updates on your projects. Learn more about Vercel for Git ↗︎

Name Status Preview Comments Updated (UTC)
react-compiler-playground ✅ Ready (Inspect) Visit Preview 💬 Add feedback Nov 15, 2024 6:14pm

@react-sizebot
Copy link

Comparing: 0480cdb...8f869e5

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 = 509.08 kB 509.08 kB = 91.00 kB 91.00 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 = 514.01 kB 514.01 kB = 91.71 kB 91.71 kB
facebook-www/ReactDOM-prod.classic.js = 588.65 kB 588.65 kB = 104.18 kB 104.18 kB
facebook-www/ReactDOM-prod.modern.js = 578.91 kB 578.91 kB = 102.59 kB 102.59 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-reconciler/cjs/react-reconciler.profiling.js +0.28% 427.73 kB 428.95 kB +0.14% 69.63 kB 69.73 kB
oss-experimental/react-art/cjs/react-art.development.js +0.22% 575.01 kB 576.29 kB +0.16% 92.87 kB 93.02 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +0.21% 657.65 kB 659.03 kB +0.17% 105.48 kB 105.66 kB

Generated by 🚫 dangerJS against 490a279

alphachart

This comment was marked as spam.

Copy link

@alphachart alphachart left a comment

Choose a reason for hiding this comment

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

.

@sebmarkbage sebmarkbage merged commit 6177b18 into facebook:main Nov 19, 2024
184 checks passed
sebmarkbage added a commit that referenced this pull request Nov 19, 2024
Stacked on #31552. Must be tested with `enableSiblingPrerendering` off
since the `use()` optimization is not on there yet.

This adds a span to the Components track when we yield in the middle of
the event loop. In this scenario, the "Render" span continues through
out the Scheduler track. So you can see that the Component itself might
not take a long time but yielding inside of it might.

This lets you see if something was blocking the React render loop while
yielding. If we're blocked 1ms or longer we log that as "Blocked".

If we're yielding due to suspending in the middle of the work loop we
log this as "Suspended".

<img width="837" alt="Screenshot 2024-11-16 at 1 15 14 PM"
src="https://github.com/user-attachments/assets/45a858ea-17e6-416c-af1a-78c126e033f3">

If the render doesn't commit because it restarts due to some other
prewarming or because some non-`use()` suspends, it doesn't have from
context components.

<img width="971" alt="Screenshot 2024-11-16 at 1 13 55 PM"
src="https://github.com/user-attachments/assets/a67724f8-702e-4e7d-9499-9ffc09541a61">

The `useActionState` path doesn't work yet because the `use()`
optimization doesn't work there for some reason. But the idea is that it
should mark the time that the component is blocked as Action instead of
Suspended.
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.

5 participants