Skip to content

fix(optimizer): resolve pending discovered dep processing on close before init (fix #23143) - #23155

Closed
santhiprakash wants to merge 1 commit into
vitejs:mainfrom
santhiprakash:fix/optimizer-close-idle-processing
Closed

santhiprakash wants to merge 1 commit into
vitejs:mainfrom
santhiprakash:fix/optimizer-close-idle-processing

Conversation

@santhiprakash

Copy link
Copy Markdown
Contributor

Description

When a dependency is discovered through the JS API before depsOptimizer.init() runs (i.e. before server.listen()), the dep's processing promise is never resolved because registerMissingImport() only starts an optimize run when initState === 'initialized'. Any in-flight request awaiting that processing promise then blocks DevEnvironment.close()'s pending-request loop, causing server.close() to hang forever.

This PR resolves the current depOptimizationProcessing promise and any queued processing promises in depsOptimizer.close(), mirroring the safety net already used in runOptimizer()'s closed branches. This unblocks in-flight requests during shutdown.

fixes #23143

Alternatives

  • We could also allow a run to start on close, but resolving the pending promises is a smaller, safer change that only affects the shutdown path.

Test plan

  • Added a regression test in packages/vite/src/node/__tests__/optimizer/discoverBeforeListen.spec.ts that discovers a dep before init() and asserts depsOptimizer.close() resolves its pending processing promise.
  • pnpm test-unit packages/vite/src/node/__tests__/optimizer/discoverBeforeListen.spec.ts passes.
  • pnpm --filter=./packages/vite exec tsc -p src/node passes.

…fore init (fix #23143)

When a dependency is discovered through the JS API before `depsOptimizer.init()`
runs (i.e. before `server.listen()`), the dep's `processing` promise is never
resolved because `registerMissingImport()` only kicks off an optimize run when
`initState === 'initialized'`. Any in-flight request awaiting that processing
promise then blocks `DevEnvironment.close()`'s pending-request loop, causing
`server.close()` to hang forever.

Resolve the current `depOptimizationProcessing` promise and any queued
processing promises in `depsOptimizer.close()`, mirroring the safety net already
used in `runOptimizer()`'s closed branches.
@santhiprakash

Copy link
Copy Markdown
Contributor Author

Closing: the source files modified by this PR have been removed or reorganized on upstream/main following a repo restructuring. The patch no longer applies.

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.

server.close() in JavaScript API hangs forever

1 participant