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

"Failed to load source map" warnings appear because of a race condition #6508

Closed
7 tasks done
vursen opened this issue Jan 14, 2022 · 2 comments · Fixed by #6758
Closed
7 tasks done

"Failed to load source map" warnings appear because of a race condition #6508

vursen opened this issue Jan 14, 2022 · 2 comments · Fixed by #6758

Comments

@vursen
Copy link
Contributor

vursen commented Jan 14, 2022

Describe the bug

When using Vite in a real-world project with many NPM dependencies that are not all pre-bundled during Vite server start, a race condition may occur when the later pre-bundling coincides with a not yet completed transformRequest() to an early pre-bundled dependency, which in turn may cause a "Failed to load source map for ..." warning.

It looks like when Vite starts pre-bundling, it cleans the cache folder and then runs esbuild. However, because esbuild is run asynchronously (proof), there is a possibility that the cache folder will be empty while esbuild is not run yet. This is a breeding ground for race conditions.

For instance, if this coincides with a stale HTTP request (or an internal call of transformRequest) currently paused on async fs.readFile, then once the source code is returned, it turns out that the corresponding source map file doesn't exist (the cache is empty) which subsequently causes a "Failed to load source map for..." warning. Here is the related fragment of code:

if (options.ssr || isFileServingAllowed(file, server)) {
try {
code = await fs.readFile(file, 'utf-8')
isDebug && debugLoad(`${timeFrom(loadStart)} [fs] ${prettyUrl}`)
} catch (e) {
if (e.code !== 'ENOENT') {
throw e
}
}
}
if (code) {
try {
map = (
convertSourceMap.fromSource(code) ||
convertSourceMap.fromMapFileSource(code, path.dirname(file))
)?.toObject()
} catch (e) {
logger.warn(`Failed to load source map for ${url}.`, {
timestamp: true
})
}

It is not a critical issue as everything is alright after a full reload. However, when the case reproduces for many requests, many irrelevant warnings will be shown which looks like something is fundamentally broken about source maps. We could see that from time to time in our Vaadin projects:

Pre-bundling dependencies:
  construct-style-sheets-polyfill
  @vaadin/router
  @vaadin/app-layout
  @vaadin/vaadin-lumo-styles
  @vaadin/tabs
  (...and 55 more)
(this will be run only when your dependencies or config have changed)
  vite v2.8.0-beta.2 dev server running at:
  > Local: http://localhost:57720/VAADIN/
  > Network: use `--host` to expose
  ready in 3502ms.


Started Vite. Time: 3903ms
[vite] new dependencies found: lit/directives/class-map.js, @vaadin/icon, updating...
[vite] Failed to load source map for /@fs/Users/vursen/dev/vaadin/start/node_modules/.vite/@adobe_lit-mobx.js?v=a770d581.
[vite] Failed to load source map for /@fs/Users/vursen/dev/vaadin/start/node_modules/.vite/@vaadin_form.js?v=a770d581
[vite] Failed to load source map for /@fs/Users/vursen/dev/vaadin/start/node_modules/.vite/@vaadin_tabs.js?v=a770d581
[vite] Failed to load source map for /@fs/Users/vursen/dev/vaadin/start/node_modules/.vite/chunk-FIUHFD.js?v=a770d581
[vite] Failed to load source map for /@fs/Users/vursen/dev/vaadin/start/node_modules/.vite/chunk-JDFKUF.js?v=a770d581
[vite] Failed to load source map for /@fs/Users/vursen/dev/vaadin/start/node_modules/.vite/chunk-LSOIUE.js?v=a770d581

Reproduction

Diff: main...vursen:race-condition-reproduction

Branch: https://github.com/vursen/vite/tree/race-condition-reproduction

In my reproduction example, I had to patch Vite so that it simulates an event loop delay before reading source maps as otherwise, it is very tricky to catch the issue with few NPM dependencies (= not many transformRequest() calls).

  1. git co race-condition-reproduction
  2. cd packages/race-condition-reproduction
  3. pnpm install
  4. pnpm run serve – this builds and starts a Vite server
  5. Open http://localhost:3000
  6. Click the "Reproduce" button
  7. See the "Failed to load source map" warning in Vite output

System Info

System:
  OS: macOS 12.1
  CPU: (8) arm64 Apple M1 Pro
  Memory: 231.73 MB / 32.00 GB
  Shell: 5.8 - /bin/zsh
Binaries:
  Node: 17.3.1 - /opt/homebrew/bin/node
  Yarn: 1.22.17 - /opt/homebrew/bin/yarn
  npm: 8.3.0 - /opt/homebrew/bin/npm
Browsers:
  Chrome: 97.0.4692.71
  Firefox: 95.0.2
  Safari: 15.2

Used Package Manager

npm

Logs

vite:resolve 0.15ms /load-missing-dep.js -> /Users/vursen/dev/vite/packages/race-condition-issue/load-missing-dep.js +10s
[PATCH] Simulate a delay for the request: /node_modules/.vite/dep.js?v=751c9552
  vite:load 0.57ms [fs] /load-missing-dep.js +10s
  vite:resolve 1.29ms missing-dep -> /Users/vursen/dev/vite/packages/race-condition-issue/node_modules/missing-dep/index.js +2ms
  vite:resolve 0.12ms /node_modules/missing-dep/index.js -> /Users/vursen/dev/vite/packages/race-condition-issue/node_modules/missing-dep/index.js +0ms
  vite:import-analysis 1.76ms [1 imports rewritten] load-missing-dep.js +10s
  vite:transform 1.95ms /load-missing-dep.js +10s
  vite:time 3.23ms /load-missing-dep.js +4s
  vite:load 0.99ms [fs] /node_modules/missing-dep/index.js +4ms
  vite:import-analysis 0.08ms [no imports] node_modules/missing-dep/index.js +3ms
  vite:transform 0.40ms /node_modules/missing-dep/index.js +2ms
5:01:12 PM [vite] new dependencies found: missing-dep, updating...
[PATCH] Resolve the delayed request...
  vite:load 113.87ms [fs] /node_modules/.vite/dep.js?v=751c9552 +109ms
5:01:12 PM [vite] Failed to load source map for /node_modules/.vite/dep.js?v=751c9552.
  vite:resolve 0.75ms /node_modules/.vite/dep.js?v=751c9552 -> null +112ms
  vite:import-analysis 0.01ms [no imports] node_modules/.vite/dep.js?v=751c9552 +109ms
  vite:transform 0.33ms /node_modules/.vite/dep.js?v=751c9552 +109ms
  vite:time 116.08ms /node_modules/.vite/dep.js?v=751c9552 +111ms
  vite:deps deps bundled in 4.64ms +11s
5:01:12 PM [vite] ✨ dependencies updated, reloading page...
  vite:resolve 0.15ms /node_modules/.vite/dep.js -> /Users/vursen/dev/vite/packages/race-condition-issue/node_modules/.vite/dep.js +45ms
  vite:time 2.02ms /node_modules/.vite/dep.js.map +46ms
  vite:load 2.50ms [fs] /node_modules/missing-dep/index.js +48ms
  vite:import-analysis 0.01ms [no imports] node_modules/missing-dep/index.js +47ms
  vite:transform 0.09ms /node_modules/missing-dep/index.js +47ms
  vite:time 154.22ms /node_modules/missing-dep/index.js +1ms
  vite:spa-fallback Rewriting GET / to /index.html +4s
  vite:time 1.14ms /index.html +2ms
  vite:load 0.32ms [fs] /main.js +24ms
  vite:resolve 0.02ms dep -> /Users/vursen/dev/vite/packages/race-condition-issue/node_modules/.vite/dep.js?v=306c5ae4 +26ms
  vite:resolve 0.18ms /node_modules/.vite/dep.js?v=306c5ae4 -> /Users/vursen/dev/vite/packages/race-condition-issue/node_modules/.vite/dep.js?v=306c5ae4 +0ms
  vite:import-analysis 0.68ms [1 imports rewritten] main.js +25ms
  vite:transform 0.76ms /main.js +25ms
  vite:time 1.55ms /main.js +23ms
  vite:load 1.98ms [fs] /@vite/client +1ms
  vite:import-analysis 1.08ms [1 imports rewritten] /Users/vursen/dev/vite/packages/vite/dist/client/client.mjs +2ms
  vite:transform 1.26ms /@vite/client +2ms
  vite:time 4.91ms /@vite/client +2ms
  vite:load 0.73ms [fs] ../vite/dist/client/env.mjs +3ms
  vite:import-analysis 0.01ms [no imports] /Users/vursen/dev/vite/packages/vite/dist/client/env.mjs +2ms
  vite:transform 0.08ms ../vite/dist/client/env.mjs +2ms
  vite:cache [memory] ../vite/dist/client/env.mjs +4s
  vite:time 0.35ms ../vite/dist/client/env.mjs +3ms

Validations

@vursen vursen changed the title "Failed to load source map" warning sometimes is shown because of a race condition "Failed to load source map" warnings are shown because of a race condition Jan 16, 2022
@suyue0731
Copy link

hi, I also meet a similar problem like this, when will this pr be merged ? thanks~

@vursen vursen changed the title "Failed to load source map" warnings are shown because of a race condition "Failed to load source map" warnings appear because of a race condition Feb 14, 2022
@vursen
Copy link
Contributor Author

vursen commented Feb 21, 2022

I checked and could no longer reproduce the reported race condition with the new approach to the deps pre-bundling in #6758.

I'll close the issue once that PR is merged.

@Niputi Niputi linked a pull request Feb 21, 2022 that will close this issue
4 tasks
@github-actions github-actions bot locked and limited conversation to collaborators Mar 18, 2022
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
2 participants