mozilla / source-map

Consume and generate source maps.
Other
3.54k stars 357 forks source link

Frequently hitting 'unreachable' errors with many source maps in memory #476

Open nornagon opened 1 year ago

nornagon commented 1 year ago

I'm operating a service which sourcemaps JavaScript Self-Profiling data from production. We have several versions of our app running concurrently, with different source maps. The service keeps an LRU cache of SourceMapConsumers with a size limit roughly calculated from smc._mappings.length. This lets us keep around 100 SourceMapConsumers active at a time before running into the WebAssembly memory limit.

However, we often see unreachable errors like the following:

RuntimeError: unreachable
     at wasm://wasm/0002f63a:wasm-function[54]:0xb65c
     at wasm://wasm/0002f63a:wasm-function[22]:0x9647
     at BasicSourceMapConsumer._parseMappings (/work/node_modules/source-map/lib/source-map-consumer.js:306:47)
     at BasicSourceMapConsumer._getMappingsPtr (/work/node_modules/source-map/lib/source-map-consumer.js:289:12)
     at /work/node_modules/source-map/lib/source-map-consumer.js:500:16
     at Object.withMappingCallback (/work/node_modules/source-map/lib/wasm.js:125:13)
     at BasicSourceMapConsumer.originalPositionFor (/work/node_modules/source-map/lib/source-map-consumer.js:496:16)
     at file:///work/dist/mapTrace.js:44:34
     at file:///work/dist/mapTrace.js:53:11
     at Array.map (<anonymous>)

I believe this indicates an out-of-memory error, where source-map's rust code tries to allocate something but can't.

Could it be possible to gracefully recover from this? I believe Rust doesn't really support graceful recovery from OOM, but perhaps source-map could check whether there's enough memory available to allocate for a SourceMapConsumer before allocating, and throw some other kind of error? That would allow using that signal to drop some old data from our cache.