Skip to content

Fix build mode setup stall on large solutions#4658

Open
johnfav03 wants to merge 2 commits into
mainfrom
fix-computedesiredwatches-perf
Open

Fix build mode setup stall on large solutions#4658
johnfav03 wants to merge 2 commits into
mainfrom
fix-computedesiredwatches-perf

Conversation

@johnfav03

Copy link
Copy Markdown
Contributor

Fixes #4614

On a large tsc -b --watch project-references solution, Found 0 errors. Watching for file changes prints within a few seconds, but filesystem watches aren't registers until computeDesiredWatches returns, which can take tens of seconds. Edits are also silently dropped during this timeframe.

computeDesiredWatches calls IsDirCoveredByWatch once per input file, buildinfo file, and package.json ancestor across all projects, which linearly scans the entire DesiredDirs map on every call. The set construction here is essentially O(files x dirs); by using a new data structure called DirWatchSet, we can reduce this to O(files x recursive dirs). In the case of the example given in the linked issue, the ~1,534 desired dirs drop to ~15 recursive dirs while the number of files remains the same.

Copilot AI review requested due to automatic review settings July 16, 2026 20:17

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Pull request overview

Optimizes watch setup for large build-mode solutions by replacing repeated full directory-map scans with indexed coverage checks.

Changes:

  • Adds DirWatchSet with constant-time exact lookup and recursive-watch scanning.
  • Integrates it into build-mode and standard watcher setup.
  • Adds coverage, casing, and recursive-upgrade unit tests.

Reviewed changes

Copilot reviewed 4 out of 4 changed files in this pull request and generated no comments.

File Description
internal/execute/watchmanager/watchmanager.go Implements DirWatchSet.
internal/execute/watchmanager/watchmanager_test.go Tests watch-set behavior.
internal/execute/watcher.go Uses indexed coverage for standard watch setup.
internal/execute/build/orchestrator.go Optimizes build-mode watch computation.

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.

tsc -b --watch takes tens of seconds to start watching on a large project-references solution (computeDesiredWatches is O(files × dirs))

2 participants