Frequently hitting 'unreachable' errors with many source maps in memory
nornagon opened this issue · 0 comments
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.