Skip to content

Conversation

@josephsavona
Copy link
Member

@josephsavona josephsavona commented Oct 5, 2021

Summary

This is an initial, partial implementation of a cleanup mechanism for the experimental Cache API. The idea is that consumers of the Cache API can register to be informed when a given Cache instance is no longer needed so that they can perform associated cleanup tasks to free resources stored in the cache. A canonical example would be cancelling pending network requests.

An overview of the high-level changes:

  • Changes the Cache type from a Map of cache instances to be an object with the original Map of instances, a reference count (to count roughly "active references" to the cache instances - more below), and an AbortController.
  • Adds a new public API, unstable_getCacheSignal(): AbortSignal, which is callable during render. It returns an AbortSignal tied to the lifetime of the cache - developers can listen for the 'abort' event on the signal, which React now triggers when a given cache instance is no longer referenced.
    • Note that AbortSignal is a web standard that is supported by other platform APIs; for example a signal can be passed to fetch() to trigger cancellation of an HTTP request.
  • Implements the above - triggering the 'abort' event - by handling passive mount/unmount for HostRoot and CacheComponent fiber nodes.

Cases handled:

  • Aborted transitions: we clean up a new cache created for an aborted transition
  • Suspense: we retain a fresh cache instance until a suspended tree resolves

For follow-ups:

  • When a subsequent cache refresh is issued before a previous refresh completes, the refreshes are queued. Fresh cache instances for previous refreshes in the queue should be cleared, retaining only the most recent cache. I plan to address this in a follow-up PR.
  • If a refresh is cancelled, the fresh cache should be cleaned up.

How did you test this change?

yarn test --all - a few tests are still failing and i'll need some guidance on how to resolve those (i'll post more details later).

@josephsavona josephsavona changed the title Cache cleanup 2 Initial implementation of cache cleanup Oct 5, 2021
@josephsavona josephsavona requested a review from acdlite October 5, 2021 19:34
@josephsavona josephsavona changed the title Initial implementation of cache cleanup [wip] Initial implementation of cache cleanup Oct 5, 2021
) {
if (!rootDoesHavePassiveEffects) {
rootDoesHavePassiveEffects = true;
pendingPassiveEffectsRemainingLanes = remainingLanes;
Copy link
Member Author

Choose a reason for hiding this comment

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

we need to store this to know which lanes were remaining when flushPassiveEffects() runs asynchronously

@josephsavona
Copy link
Member Author

Okay @acdlite this is ready for another review pass!

@josephsavona josephsavona changed the title [wip] Initial implementation of cache cleanup Initial implementation of cache cleanup Oct 12, 2021
@sizebot
Copy link

sizebot commented Oct 20, 2021

Comparing: bfb4022...dcf04a4

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.min.js = 130.19 kB 130.19 kB = 41.41 kB 41.41 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +1.61% 133.02 kB 135.16 kB +1.33% 42.39 kB 42.95 kB
facebook-www/ReactDOM-prod.classic.js +1.34% 414.34 kB 419.90 kB +1.01% 76.56 kB 77.33 kB
facebook-www/ReactDOM-prod.modern.js +1.38% 402.93 kB 408.48 kB +1.03% 74.82 kB 75.59 kB
facebook-www/ReactDOMForked-prod.classic.js +1.34% 414.34 kB 419.90 kB +1.01% 76.56 kB 77.34 kB
oss-experimental/react-test-renderer/umd/react-test-renderer.production.min.js +2.62% 82.32 kB 84.48 kB +2.44% 25.76 kB 26.39 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.min.js +2.61% 82.14 kB 84.28 kB +1.84% 25.39 kB 25.86 kB
oss-experimental/react-art/cjs/react-art.production.min.js +2.52% 85.39 kB 87.54 kB +2.16% 26.44 kB 27.01 kB
oss-experimental/react-reconciler/cjs/react-reconciler.production.min.js +2.27% 94.61 kB 96.76 kB +1.80% 28.95 kB 29.47 kB
facebook-www/ReactART-prod.modern.js +2.21% 261.79 kB 267.58 kB +1.72% 46.80 kB 47.60 kB
facebook-www/ReactART-prod.classic.js +2.15% 269.45 kB 275.24 kB +1.74% 48.04 kB 48.88 kB
oss-experimental/react-reconciler/cjs/react-reconciler.profiling.min.js +2.07% 103.64 kB 105.78 kB +1.87% 31.52 kB 32.11 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-test-renderer/umd/react-test-renderer.production.min.js +2.62% 82.32 kB 84.48 kB +2.44% 25.76 kB 26.39 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.production.min.js +2.61% 82.14 kB 84.28 kB +1.84% 25.39 kB 25.86 kB
oss-experimental/react-art/cjs/react-art.production.min.js +2.52% 85.39 kB 87.54 kB +2.16% 26.44 kB 27.01 kB
oss-experimental/react-reconciler/cjs/react-reconciler.production.min.js +2.27% 94.61 kB 96.76 kB +1.80% 28.95 kB 29.47 kB
facebook-www/ReactART-prod.modern.js +2.21% 261.79 kB 267.58 kB +1.72% 46.80 kB 47.60 kB
facebook-www/ReactART-prod.classic.js +2.15% 269.45 kB 275.24 kB +1.74% 48.04 kB 48.88 kB
oss-experimental/react-reconciler/cjs/react-reconciler.profiling.min.js +2.07% 103.64 kB 105.78 kB +1.87% 31.52 kB 32.11 kB
oss-experimental/react-art/umd/react-art.production.min.js +1.73% 121.31 kB 123.41 kB +1.43% 37.66 kB 38.19 kB
oss-experimental/react-test-renderer/cjs/react-test-renderer.development.js +1.71% 636.28 kB 647.18 kB +1.71% 139.50 kB 141.88 kB
oss-experimental/react-test-renderer/umd/react-test-renderer.development.js +1.70% 667.09 kB 678.46 kB +1.69% 141.08 kB 143.47 kB
facebook-www/ReactTestRenderer-dev.classic.js +1.66% 659.07 kB 669.98 kB +1.63% 141.92 kB 144.24 kB
facebook-www/ReactTestRenderer-dev.modern.js +1.66% 659.08 kB 670.00 kB +1.63% 141.93 kB 144.25 kB
oss-experimental/react-dom/cjs/react-dom.production.min.js +1.61% 133.02 kB 135.16 kB +1.33% 42.39 kB 42.95 kB
oss-experimental/react-dom/umd/react-dom.production.min.js +1.57% 133.11 kB 135.21 kB +1.24% 43.07 kB 43.61 kB
oss-experimental/react-art/cjs/react-art.development.js +1.57% 693.58 kB 704.47 kB +1.57% 150.42 kB 152.77 kB
oss-experimental/react-dom/cjs/react-dom.profiling.min.js +1.49% 143.11 kB 145.25 kB +1.12% 45.47 kB 45.98 kB
facebook-www/ReactART-dev.modern.js +1.49% 733.72 kB 744.63 kB +1.51% 156.71 kB 159.08 kB
facebook-www/ReactART-dev.classic.js +1.47% 743.91 kB 754.83 kB +1.49% 158.81 kB 161.17 kB
oss-experimental/react-dom/umd/react-dom.profiling.min.js +1.46% 142.02 kB 144.10 kB +1.12% 45.79 kB 46.30 kB
oss-experimental/react-reconciler/cjs/react-reconciler.development.js +1.46% 744.92 kB 755.81 kB +1.43% 158.45 kB 160.72 kB
oss-experimental/react-art/umd/react-art.development.js +1.42% 797.42 kB 808.77 kB +1.36% 168.36 kB 170.65 kB
facebook-www/ReactDOMTesting-prod.modern.js +1.40% 396.84 kB 402.40 kB +1.00% 75.10 kB 75.85 kB
facebook-www/ReactDOM-prod.modern.js +1.38% 402.93 kB 408.48 kB +1.03% 74.82 kB 75.59 kB
facebook-www/ReactDOMForked-prod.modern.js +1.38% 402.93 kB 408.48 kB +1.03% 74.82 kB 75.59 kB
facebook-www/ReactDOMTesting-prod.classic.js +1.35% 410.13 kB 415.68 kB +0.97% 77.23 kB 77.98 kB
facebook-www/ReactDOM-prod.classic.js +1.34% 414.34 kB 419.90 kB +1.01% 76.56 kB 77.33 kB
facebook-www/ReactDOMForked-prod.classic.js +1.34% 414.34 kB 419.90 kB +1.01% 76.56 kB 77.34 kB
facebook-www/ReactDOM-profiling.modern.js +1.22% 435.41 kB 440.74 kB +0.93% 80.49 kB 81.24 kB
facebook-www/ReactDOMForked-profiling.modern.js +1.22% 435.41 kB 440.74 kB +0.93% 80.50 kB 81.25 kB
facebook-www/ReactDOM-profiling.classic.js +1.19% 446.88 kB 452.21 kB +0.97% 82.17 kB 82.96 kB
facebook-www/ReactDOMForked-profiling.classic.js +1.19% 446.88 kB 452.21 kB +0.97% 82.17 kB 82.97 kB
oss-experimental/react/cjs/react-unstable-shared-subset.production.min.js +1.19% 6.55 kB 6.63 kB +0.41% 2.68 kB 2.69 kB
facebook-www/ReactDOMTesting-dev.modern.js +1.11% 987.97 kB 998.95 kB +1.06% 222.36 kB 224.72 kB
facebook-www/ReactDOMTesting-dev.classic.js +1.08% 1,014.67 kB 1,025.64 kB +1.04% 227.78 kB 230.16 kB
oss-experimental/react-dom/cjs/react-dom.development.js +1.07% 1,018.65 kB 1,029.54 kB +1.01% 228.69 kB 231.01 kB
oss-experimental/react-dom/umd/react-dom.development.js +1.06% 1,068.67 kB 1,080.01 kB +1.00% 231.04 kB 233.35 kB
facebook-www/ReactDOMForked-dev.modern.js +1.01% 1,076.95 kB 1,087.86 kB +0.97% 238.75 kB 241.07 kB
facebook-www/ReactDOM-dev.modern.js +1.01% 1,076.95 kB 1,087.86 kB +0.97% 238.75 kB 241.07 kB
oss-experimental/react/cjs/react.production.min.js +1.00% 7.83 kB 7.90 kB +0.27% 2.98 kB 2.99 kB
facebook-www/ReactDOMForked-dev.classic.js +0.99% 1,101.02 kB 1,111.93 kB +0.95% 243.60 kB 245.92 kB
facebook-www/ReactDOM-dev.classic.js +0.99% 1,101.02 kB 1,111.93 kB +0.95% 243.60 kB 245.92 kB
facebook-react-native/react/cjs/React-prod.js +0.63% 17.21 kB 17.32 kB +0.21% 4.39 kB 4.40 kB
facebook-www/React-prod.modern.js +0.62% 17.29 kB 17.40 kB +0.27% 4.42 kB 4.43 kB
facebook-www/React-prod.classic.js +0.62% 17.44 kB 17.54 kB +0.18% 4.47 kB 4.47 kB
oss-experimental/react/umd/react.profiling.min.js +0.61% 11.82 kB 11.89 kB +0.28% 4.63 kB 4.64 kB
oss-experimental/react/umd/react.production.min.js +0.61% 11.82 kB 11.89 kB +0.28% 4.63 kB 4.64 kB
facebook-react-native/react/cjs/React-profiling.js +0.59% 18.36 kB 18.47 kB +0.33% 4.56 kB 4.58 kB
facebook-www/React-profiling.modern.js +0.59% 18.44 kB 18.54 kB +0.33% 4.59 kB 4.61 kB
facebook-www/React-profiling.classic.js +0.58% 18.58 kB 18.69 kB +0.30% 4.64 kB 4.65 kB
oss-experimental/react/cjs/react-unstable-shared-subset.development.js +0.27% 75.01 kB 75.22 kB +0.13% 20.52 kB 20.55 kB
oss-experimental/react/cjs/react.development.js +0.23% 90.46 kB 90.66 kB +0.11% 24.34 kB 24.36 kB

Generated by 🚫 dangerJS against dcf04a4

Copy link
Collaborator

@acdlite acdlite left a comment

Choose a reason for hiding this comment

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

🎉🎉🎉 Yay! Thanks so much for pushing this feature through! I think the rest we can address in follow up PRs.

Looks like you'll need to pull upstream changes and resolve them one more time before merging.

Very exciting!

@josephsavona josephsavona merged commit fa9bea0 into facebook:main Oct 21, 2021
@aobitoz

This comment has been minimized.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

5 participants