Skip to content

[backport] Fix request-context retention in the default use cache handler - #99081

Open
A13k2 wants to merge 1 commit into
vercel:next-16-3from
A13k2:backport/97941-use-cache-retention
Open

A13k2 wants to merge 1 commit into
vercel:next-16-3from
A13k2:backport/97941-use-cache-retention

Conversation

@A13k2

@A13k2 A13k2 commented Sep 23, 2026

Copy link
Copy Markdown

Backports #97941 ("Fix request-context retention in the default use cache handler") to next-16-3.

Cherry-picked from c5b960e, no conflicts. packages/next/src/server/lib/cache-handlers/default.ts on next-16-3 is byte-identical to its state right before #97941. streamFromBuffer and streamToBuffer already exist in node-web-streams-helper.ts on 16.3, and the new test only imports Node built-ins and neighbouring modules.

Why this is worth a backport

On 16.3.x, every on-demand prerender of a route that uses 'use cache' keeps its whole request alive: the closed ServerResponse, the async context and the rendered HTML, until the LRU entry is evicted. A crawler walking long-tail URLs, which is normal traffic for an SEO-facing site, takes a Cloud Run instance down within minutes. #97476 (backported in #98448) doesn't cover this path.

Reproduction (16.3.6)

Setup:

  • A bare app: cacheComponents: true, and one route app/p/[id]/page.tsx that awaits a 'use cache' function with cacheLife('hours') and has generateStaticParams returning [{ id: '0' }].
  • next build && next start in a container with 1 CPU and 1 GiB.
  • autocannon -c 8 against /p/1, /p/2, … (a unique URL per request).
Result
16.3.6 heap 444 MB after 10 s, V8 OOM (exit 133) before 20 s, after ~240 pages
16.3.6 + this patch (applied to the compiled dist) heap flat at 59–82 MB over 2,911 pages, 73 req/s, 0 errors
16.4.0-canary.38 (contains #97941) heap flat at 65–79 MB over 3,110 pages
control: same page without 'use cache', 16.3.6 flat at ~230 MB RSS

A heap snapshot on unpatched 16.3.6 showed complete rendered HTML documents reachable through the request's work store: kResourceStore → cacheController → AbortSignal.reason → the render. That matches the description in #97934.


Disclosure: this PR and its measurements were prepared with an AI coding agent (Claude Code) and reviewed by me. We run a multi-tenant Next.js 16 app on Firebase App Hosting, and this class of memory growth under crawler traffic has been hurting us for months. A 16.3.x release with this fix would let us stay on stable instead of a canary.

…l#97941)

Fixes vercel#97934.

The default use cache handler uses live ReadableStream objects. Those
streams retain references to the request’s async context and closed HTTP
response, causing memory to grow with cached entries and potentially
produce OOMs.

The fix converts each stream into a plain Buffer before caching it.
Every cache hit then gets a fresh temporary stream created from those
bytes. The content remains cached, but completed requests can now be
garbage-collected.

---

Basically - the LRU cache stores live ReadableStream objects, which keep
completed request contexts and closed responses in memory until that
cache is evicted.

(cherry picked from commit c5b960e)
@github-actions

Copy link
Copy Markdown
Contributor

Failing test suites

Commit: be183fb | About building and testing Next.js

pnpm test-dev-experimental-turbo test/e2e/app-dir/metadata-dynamic-routes-async-deps/index.test.ts (turbopack) (Experimental) (job)

  • app dir - metadata dynamic routes with async deps > should render page with og:image meta tag when opengraph-image has async dependencies (DD)
  • app dir - metadata dynamic routes with async deps > should serve the opengraph-image route as a valid image (DD)
Expand output

● app dir - metadata dynamic routes with async deps › should render page with og:image meta tag when opengraph-image has async dependencies

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes with async deps › should serve the opengraph-image route as a valid image

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

pnpm test-start-experimental-turbo test/e2e/app-dir/metadata-dynamic-routes-async-deps/index.test.ts (turbopack) (Experimental) (job)

  • app dir - metadata dynamic routes with async deps > should render page with og:image meta tag when opengraph-image has async dependencies (DD)
  • app dir - metadata dynamic routes with async deps > should serve the opengraph-image route as a valid image (DD)
Expand output

● app dir - metadata dynamic routes with async deps › should render page with og:image meta tag when opengraph-image has async dependencies

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes with async deps › should serve the opengraph-image route as a valid image

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

pnpm test-dev test/e2e/app-dir/metadata-dynamic-routes-async-deps/index.test.ts (job)

  • app dir - metadata dynamic routes with async deps > should render page with og:image meta tag when opengraph-image has async dependencies (DD)
  • app dir - metadata dynamic routes with async deps > should serve the opengraph-image route as a valid image (DD)
Expand output

● app dir - metadata dynamic routes with async deps › should render page with og:image meta tag when opengraph-image has async dependencies

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes with async deps › should serve the opengraph-image route as a valid image

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

pnpm test-dev test/e2e/app-dir/metadata-dynamic-routes/index.test.ts (job)

  • app dir - metadata dynamic routes > should generate unique path for image routes under group routes (DD)
  • app dir - metadata dynamic routes > should pick configured metadataBase instead of deployment url for canonical url (DD)
  • app dir - metadata dynamic routes > should inject dynamic metadata properly to head (DD)
  • app dir - metadata dynamic routes > should use localhost for local prod and fallback to deployment url when metadataBase is falsy (DD)
  • app dir - metadata dynamic routes > icon image routes > should render icon with dynamic routes (DD)
  • app dir - metadata dynamic routes > icon image routes > should render apple icon with dynamic routes (DD)
  • app dir - metadata dynamic routes > robots.txt > should handle robots.[ext] dynamic routes (DD)
  • app dir - metadata dynamic routes > sitemap > should handle sitemap.[ext] dynamic routes (DD)
  • app dir - metadata dynamic routes > sitemap > should support generate multi sitemaps with generateSitemaps (DD)
  • app dir - metadata dynamic routes > sitemap > should 404 for non-existing id from generateImageMetadata (DD)
  • app dir - metadata dynamic routes > sitemap > should not throw if client components are imported but not used in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should support alternate.languages in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should support images in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should support videos in sitemap (DD)
  • app dir - metadata dynamic routes > social image routes > should handle manifest.[ext] dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should render og image with opengraph-image dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should render og image with twitter-image dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should support generate multi images with generateImageMetadata (DD)
  • app dir - metadata dynamic routes > social image routes > should fill params into dynamic routes url of metadata images (DD)
  • app dir - metadata dynamic routes > social image routes > should support params as argument in dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should fill params into routes groups url of static images (DD)
Expand output

● app dir - metadata dynamic routes › robots.txt › should handle robots.[ext] dynamic routes

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should handle sitemap.[ext] dynamic routes

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support generate multi sitemaps with generateSitemaps

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should 404 for non-existing id from generateImageMetadata

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should not throw if client components are imported but not used in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support alternate.languages in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support images in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support videos in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextDevInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextDevInstance.setup (lib/next-modes/next-dev.ts:17:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › social image routes › should handle manifest.[ext] dynamic routes

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../

... truncated ...

pnpm test-start test/e2e/app-dir/metadata-dynamic-routes-async-deps/index.test.ts (job)

  • app dir - metadata dynamic routes with async deps > should render page with og:image meta tag when opengraph-image has async dependencies (DD)
  • app dir - metadata dynamic routes with async deps > should serve the opengraph-image route as a valid image (DD)
Expand output

● app dir - metadata dynamic routes with async deps › should render page with og:image meta tag when opengraph-image has async dependencies

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes with async deps › should serve the opengraph-image route as a valid image

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

pnpm test-start test/e2e/app-dir/metadata-dynamic-routes/index.test.ts (job)

  • app dir - metadata dynamic routes > should generate unique path for image routes under group routes (DD)
  • app dir - metadata dynamic routes > should pick configured metadataBase instead of deployment url for canonical url (DD)
  • app dir - metadata dynamic routes > should inject dynamic metadata properly to head (DD)
  • app dir - metadata dynamic routes > should use localhost for local prod and fallback to deployment url when metadataBase is falsy (DD)
  • app dir - metadata dynamic routes > should support edge runtime of image routes (DD)
  • app dir - metadata dynamic routes > should include default og font files in file trace (DD)
  • app dir - metadata dynamic routes > should contain generated routes in prerender manifest (DD)
  • app dir - metadata dynamic routes > icon image routes > should render icon with dynamic routes (DD)
  • app dir - metadata dynamic routes > icon image routes > should render apple icon with dynamic routes (DD)
  • app dir - metadata dynamic routes > robots.txt > should handle robots.[ext] dynamic routes (DD)
  • app dir - metadata dynamic routes > route segment config > should generate dynamic route if dynamic config is force-dynamic (DD)
  • app dir - metadata dynamic routes > sitemap > should handle sitemap.[ext] dynamic routes (DD)
  • app dir - metadata dynamic routes > sitemap > should support generate multi sitemaps with generateSitemaps (DD)
  • app dir - metadata dynamic routes > sitemap > should 404 for non-existing id from generateImageMetadata (DD)
  • app dir - metadata dynamic routes > sitemap > should not throw if client components are imported but not used in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should support alternate.languages in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should support images in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should support videos in sitemap (DD)
  • app dir - metadata dynamic routes > sitemap > should optimize routes without multiple generation API as static routes (DD)
  • app dir - metadata dynamic routes > sitemap > should generate static paths of dynamic sitemap in production (DD)
  • app dir - metadata dynamic routes > social image routes > should handle manifest.[ext] dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should render og image with opengraph-image dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should render og image with twitter-image dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should support generate multi images with generateImageMetadata (DD)
  • app dir - metadata dynamic routes > social image routes > should fill params into dynamic routes url of metadata images (DD)
  • app dir - metadata dynamic routes > social image routes > should support params as argument in dynamic routes (DD)
  • app dir - metadata dynamic routes > social image routes > should fill params into routes groups url of static images (DD)
Expand output

● app dir - metadata dynamic routes › robots.txt › should handle robots.[ext] dynamic routes

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should handle sitemap.[ext] dynamic routes

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support generate multi sitemaps with generateSitemaps

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should 404 for non-existing id from generateImageMetadata

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should not throw if client components are imported but not used in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support alternate.languages in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support images in sitemap

Command failed with exit code 1 (EPERM): pnpm install --strict-peer-dependencies=false --no-frozen-lockfile --config.cacheDir=/tmp --prefer-offline

  31 |   }
  32 |
> 33 |   await execa('pnpm', args, {
     |   ^
  34 |     cwd,
  35 |     stdio: ['ignore', 'inherit', 'inherit'],
  36 |   })

  at makeError (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/lib/error.js:58:11)
  at handlePromise (../node_modules/.pnpm/execa@2.0.3/node_modules/execa/index.js:112:26)
  at installDependencies (lib/create-next-install.js:33:3)
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at lib/create-next-install.js:351:9
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNextInstall (lib/create-next-install.js:166:10)
  at lib/next-modes/base.ts:356:13
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at NextStartInstance.createTestDir (lib/next-modes/base.ts:244:5)
  at NextStartInstance.setup (lib/next-modes/next-start.ts:61:5)
  at lib/e2e-utils/index.ts:289:7
  at Span.traceAsyncFn (../packages/next/src/trace/trace.ts:146:14)
  at createNext (lib/e2e-utils/index.ts:254:12)
  at Object.<anonymous> (lib/e2e-utils/index.ts:344:14)

● app dir - metadata dynamic routes › sitemap › should support videos in sitemap

Command failed with 

... truncated to fit in one GitHub comment ...

@xabierlameiro

Copy link
Copy Markdown

This fixes the retention it targets, but on Node 24.18+ the way it stores the value makes the cache hold far more than cacheMaxMemorySize. The heap stays flat. The growth is all in arrayBuffers, which is why it doesn't show up in the table above.

set() stores the result of streamToBuffer(), which is Buffer.concat(). Anything under half of Buffer.poolSize comes out as a slice of the shared pool, and since Node 24.18.0 / 26.3.0 that pool is 64 KiB (nodejs/node#63597). So a 2 KB entry keeps a whole 64 KiB slab alive, while the LRU only counts its 2 KB byteLength.

I measured it on a cacheComponents app with one route: generateStaticParams plus a 'use cache' function with cacheLife('minutes'), standalone, a new id on every request, 8 × 5,000 requests. Values are arrayBuffers after a forced GC, once they stop growing:

Next Node arrayBuffers
16.3.8 24.18 108 MB
16.4.0-canary.60 (has #97941) 24.18 ~690 MB
16.4.0-canary.60 24.15 (8 KiB pool) 158 MB
16.4.0-canary.60, value copied as below 24.18 108 MB

The heap snapshot of the second row has 10,993 ArrayBuffers of exactly 64 KiB (687 MB), each held by one to three Buffers. With {id: n % 200} it stays flat, so it's per entry.

Copying the value into its own allocation before storing it is enough:

const pooled = await streamToBuffer(entry.value)
const value = Buffer.allocUnsafeSlow(pooled.byteLength)
pooled.copy(value)

I'd keep the copy here rather than in streamToBuffer(), which other callers use for short-lived buffers where the pool is what you want.

It reproduces without Next. 20,000 values of ~2 KB, built with Buffer.concat() while other short buffers come and go:

v24.15.0 pool=8192   concat: counted 38.2 MB, arrayBuffers  67.0 MB
v24.18.0 pool=65536  concat: counted 38.2 MB, arrayBuffers 178.7 MB
v24.18.0 pool=65536  copy:   counted 38.2 MB, arrayBuffers  38.4 MB

Measured with next-leak, a CLI I maintain: npx next-leak@0.13.1 . --routes /items --cycles 8.

@brunorzn

brunorzn commented Oct 7, 2026

Copy link
Copy Markdown

Hi !

We're hitting this in production on 16.3.6 (Vercel, Fluid compute, cacheComponents: true).

Instances grow steadily until the 2 GB limit, then 300s timeouts and "instance was killed because it ran out of available memory".

Local repro on a production build (next start, ~1,200 unique URLs from our sitemaps, concurrency 3):

  • default config: heap grows ~1.3 MB per unique URL; heap snapshots show one full rendered HTML string retained per page, plus stream buffers; V8 OOM with --max-old-space-size=1536 during the second pass

  • cacheMaxMemorySize: 0: RSS flat at ~470 MB across 4 passes, no errors

This branch has not been deployed

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

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants