-
Notifications
You must be signed in to change notification settings - Fork 49.6k
[DevTools] Ignore repeated removals of the same IO #34495
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -2902,9 +2902,22 @@ export function attach( | |
// Let's remove it from the parent SuspenseNode. | ||
const ioInfo = asyncInfo.awaited; | ||
const suspendedBySet = parentSuspenseNode.suspendedBy.get(ioInfo); | ||
// A boundary can await the same IO multiple times. | ||
// We still want to error if we're trying to remove IO that isn't present on | ||
// this boundary so we need to check if we've already removed it. | ||
// We're assuming previousSuspendedBy is a small array so this should be faster | ||
// than allocating and maintaining a Set. | ||
let alreadyRemovedIO = false; | ||
for (let j = 0; j < i; j++) { | ||
const removedIOInfo = previousSuspendedBy[j].awaited; | ||
if (removedIOInfo === ioInfo) { | ||
alreadyRemovedIO = true; | ||
break; | ||
} | ||
} | ||
if ( | ||
suspendedBySet === undefined || | ||
!suspendedBySet.delete(instance) | ||
(!alreadyRemovedIO && !suspendedBySet.delete(instance)) | ||
) { | ||
throw new Error( | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You could just check There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Instead of what? The async info in There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I see. Then you can do it one level below with a custom loop walking to this index. Still likely faster to check a small set like this in the existing array than even just running the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. |
||
'We are cleaning up async info that was not on the parent Suspense boundary. ' + | ||
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ideally we'd check if
!suspendedBySet.delete(instance)
first before doing the loop so that in the common case when we do succeed in deleting it, there's no reason to check.