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

Add test to verify that inner caches are excluded from Resume Data Cache #75883

Merged
merged 1 commit into from
Feb 10, 2025

Conversation

unstubbable
Copy link
Contributor

@unstubbable unstubbable commented Feb 10, 2025

The Resume Data Cache (RDC) is used to provide cache consistency when resuming a partial prerendered static shell. When reading from this cache, it is not possible for there to be a miss because, regardless of the cache age, we always consume the cache entries on resume because they are temporarily bound to the static shell being served for this particular request. Since the cache entry can never miss, there is no need to store inner cache entries in the Resume Data Cache because the only time you would encounter an inner entry is if the outer entry had to revalidate.

We have already optimized the Resume Data Cache by excluding writing to it during prerendering (and dev warmup rendering) if we're already inside a cache scope. We also handle that you can have an inner cache entry fill the backing cache and omit the RDC entry, and then later we encounter that same cache entry in the prerender scope, and even though we don't need to produce a new cache entry (it was already cached in the backing cache implementation), we do still write it to the Resume Data Cache.

The test added in this PR verifies this behavior and ensures that we don't regress in the future.

closes NAR-54

@ijjk ijjk added created-by: Next.js team PRs by the Next.js team. tests labels Feb 10, 2025
@ijjk
Copy link
Member

ijjk commented Feb 10, 2025

Tests Passed

@ijjk
Copy link
Member

ijjk commented Feb 10, 2025

Stats from current PR

Default Build (Increase detected ⚠️)
General Overall increase ⚠️
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
buildDuration 20.4s 14.7s N/A
buildDurationCached 13.8s 11.6s N/A
nodeModulesSize 393 MB 393 MB ⚠️ +306 B
nextStartRea..uration (ms) 389ms 384ms N/A
Client Bundles (main, webpack)
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
5306-HASH.js gzip 54.2 kB 54.2 kB N/A
8276.HASH.js gzip 169 B 168 B N/A
8377-HASH.js gzip 5.46 kB 5.46 kB N/A
bccd1874-HASH.js gzip 53 kB 53 kB
framework-HASH.js gzip 57.5 kB 57.5 kB N/A
main-app-HASH.js gzip 242 B 241 B N/A
main-HASH.js gzip 34.5 kB 34.5 kB N/A
webpack-HASH.js gzip 1.71 kB 1.71 kB N/A
Overall change 53 kB 53 kB
Legacy Client Bundles (polyfills)
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
polyfills-HASH.js gzip 39.4 kB 39.4 kB
Overall change 39.4 kB 39.4 kB
Client Pages
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
_app-HASH.js gzip 193 B 193 B
_error-HASH.js gzip 193 B 193 B
amp-HASH.js gzip 512 B 510 B N/A
css-HASH.js gzip 343 B 342 B N/A
dynamic-HASH.js gzip 1.84 kB 1.84 kB
edge-ssr-HASH.js gzip 265 B 265 B
head-HASH.js gzip 363 B 362 B N/A
hooks-HASH.js gzip 393 B 392 B N/A
image-HASH.js gzip 4.59 kB 4.58 kB N/A
index-HASH.js gzip 268 B 268 B
link-HASH.js gzip 2.35 kB 2.35 kB N/A
routerDirect..HASH.js gzip 328 B 328 B
script-HASH.js gzip 397 B 397 B
withRouter-HASH.js gzip 323 B 326 B N/A
1afbb74e6ecf..834.css gzip 106 B 106 B
Overall change 3.59 kB 3.59 kB
Client Build Manifests
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
_buildManifest.js gzip 748 B 747 B N/A
Overall change 0 B 0 B
Rendered Page Sizes
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
index.html gzip 523 B 524 B N/A
link.html gzip 538 B 539 B N/A
withRouter.html gzip 519 B 520 B N/A
Overall change 0 B 0 B
Edge SSR bundle Size
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
edge-ssr.js gzip 130 kB 130 kB N/A
page.js gzip 211 kB 211 kB N/A
Overall change 0 B 0 B
Middleware size
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
middleware-b..fest.js gzip 675 B 672 B N/A
middleware-r..fest.js gzip 155 B 156 B N/A
middleware.js gzip 31.3 kB 31.3 kB N/A
edge-runtime..pack.js gzip 844 B 844 B
Overall change 844 B 844 B
Next Runtimes
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
app-page-exp...dev.js gzip 394 kB 394 kB N/A
app-page-exp..prod.js gzip 132 kB 132 kB
app-page-tur..prod.js gzip 145 kB 145 kB
app-page-tur..prod.js gzip 141 kB 141 kB
app-page.run...dev.js gzip 382 kB 382 kB N/A
app-page.run..prod.js gzip 128 kB 128 kB
app-route-ex...dev.js gzip 39.3 kB 39.3 kB
app-route-ex..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.6 kB 25.6 kB
app-route-tu..prod.js gzip 25.4 kB 25.4 kB
app-route.ru...dev.js gzip 40.9 kB 40.9 kB
app-route.ru..prod.js gzip 25.4 kB 25.4 kB
dist_client_...dev.js gzip 356 B 356 B
dist_client_...dev.js gzip 349 B 349 B
pages-api-tu..prod.js gzip 9.69 kB 9.69 kB
pages-api.ru...dev.js gzip 11.8 kB 11.8 kB
pages-api.ru..prod.js gzip 9.68 kB 9.68 kB
pages-turbo...prod.js gzip 21.9 kB 21.9 kB
pages.runtim...dev.js gzip 31.5 kB 31.5 kB
pages.runtim..prod.js gzip 21.9 kB 21.9 kB
server.runti..prod.js gzip 60.5 kB 60.5 kB
Overall change 896 kB 896 kB
build cache Overall increase ⚠️
vercel/next.js canary vercel/next.js hl/rdc-test-inner-caches Change
0.pack gzip 2.1 MB 2.11 MB ⚠️ +2.95 kB
index.pack gzip 74.4 kB 75.6 kB ⚠️ +1.13 kB
Overall change 2.18 MB 2.18 MB ⚠️ +4.08 kB
Diff details
Diff for main-HASH.js

Diff too large to display

Commit: ef02b2a

Resume Data Cache is used to provide cache consistency when resuming a
partial prerendered static shell. When reading from this cache, it is
not possible for there to be a miss because, regardless of the cache
age, we always consume the cache entries on resume because they are
temporarily bound to the static shell being served for this particular
request. Since the cache entry can never miss, there is no need to store
inner cache entries in the Resume Data Cache because the only time you
would encounter an inner entry is if the outer entry had to revalidate.

We have already optimized the Resume Data Cache by excluding writing to
it during prerendering (and dev warmup rendering) if we're already
inside a cache scope. We also handle that you can have an inner cache
entry fill the backing cache and omit the RDC entry, and then later we
encounter that same cache entry in the prerender scope, and even though
we don't need to produce a new cache entry (it was already cached in the
backing cache implementation), we do still write it to the Resume Data
Cache.

The test added in this PR verifies this behavior and ensures that we
don't regress in the future.

closes NAR-54
@unstubbable unstubbable force-pushed the hl/rdc-test-inner-caches branch from 62ca8c0 to ef02b2a Compare February 10, 2025 21:41
@unstubbable unstubbable marked this pull request as ready for review February 10, 2025 21:42
@unstubbable unstubbable enabled auto-merge (squash) February 10, 2025 22:13
@unstubbable unstubbable merged commit 8daa66b into canary Feb 10, 2025
130 checks passed
@unstubbable unstubbable deleted the hl/rdc-test-inner-caches branch February 10, 2025 22:17
@github-actions github-actions bot locked as resolved and limited conversation to collaborators Feb 25, 2025
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants