fix(Cx): coalesce re-entrant synchronous updates to avoid React max-update-depth#1310
Merged
Conversation
…pdate-depth Large renders that write to the store while rendering (e.g. a several-hundred-page report) could re-render the root Cx and detached Restates hundreds of times in one synchronous burst, exceeding React's global nested-update limit and crashing or hanging the render. Cx now coalesces re-entrant synchronous updates and yields to a microtask once a burst grows deep, so React's counter resets before continuing. Updates that settle in a single render -- virtually all of them -- behave as before; it only diverges under a deep re-entrant burst. batchUpdatesAndNotify still resolves only once the store reaches a fixpoint, so measure-after-render flows such as page-breaking are unaffected. On by default. If you suspect it causes trouble, opt out at startup with disableSyncUpdateCoalescing() and please report the issue so it can be fixed. The burst threshold can be tuned with enableSyncUpdateCoalescing(limit).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Large re-entrant renders — e.g. big reports that write to the store while they render — could re-render the root
Cxand detachedRestates hundreds of times in one synchronous burst, exceeding React's global nested-update limit ("Maximum update depth exceeded") and crashing or hanging the render.Cxnow coalesces re-entrant synchronous updates and, once a burst grows deep, yields to a microtask so React's counter resets before continuing. Updates that settle in a single render — virtually all of them — behave as before; it only diverges under a deep re-entrant burst.batchUpdatesAndNotifystill resolves only once the store reaches a fixpoint, so measure-after-render flows such as page-breaking are unaffected.On by default. Opt out at startup with
disableSyncUpdateCoalescing()(please report any issues so they can be fixed), and tune the burst threshold withenableSyncUpdateCoalescing(limit).Supersedes the approach in 15996b4.