From 7028b7f51074f9ceef22258a8643d0f90de2388b Mon Sep 17 00:00:00 2001 From: Rob Hogan Date: Fri, 16 Sep 2022 09:18:04 -0700 Subject: [PATCH] Warn and annotate on `metro-file-map` cache read error Summary: Currently `metro-file-map` will *silently* ignore errors encountered when reading from the configured cache manager, and fall back to a cold crawl. This adds a console warning and records an annotation to give these error cases more visibility. In addition, propagate unexpected errors, such as deserialisation failures, from the default `DiskCacheManager`. Changelog: **[Fix]** Log warning on unexpected error during `metro-file-map`cache read. Reviewed By: huntie Differential Revision: D39514918 fbshipit-source-id: 4569a1ed7f2114307c96c0b5064b367ebd487947 --- packages/metro-file-map/src/cache/DiskCacheManager.js | 10 ++++++++-- packages/metro-file-map/src/index.js | 10 +++++++++- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/packages/metro-file-map/src/cache/DiskCacheManager.js b/packages/metro-file-map/src/cache/DiskCacheManager.js index 6458b9a7c9..f791d38365 100644 --- a/packages/metro-file-map/src/cache/DiskCacheManager.js +++ b/packages/metro-file-map/src/cache/DiskCacheManager.js @@ -68,8 +68,14 @@ export class DiskCacheManager implements CacheManager { async read(): Promise { try { return deserialize(readFileSync(this._cachePath)); - } catch {} - return null; + } catch (e) { + if (e?.code === 'ENOENT') { + // Cache file not found - not considered an error. + return null; + } + // Rethrow anything else. + throw e; + } } async write( diff --git a/packages/metro-file-map/src/index.js b/packages/metro-file-map/src/index.js index 19df822553..b8019df8b5 100644 --- a/packages/metro-file-map/src/index.js +++ b/packages/metro-file-map/src/index.js @@ -411,7 +411,15 @@ export default class HasteMap extends EventEmitter { this._options.perfLogger?.point('read_start'); try { data = await this._cacheManager.read(); - } catch {} + } catch (e) { + this._console.warn( + 'Error while reading cache, falling back to a full crawl:\n', + e, + ); + this._options.perfLogger?.annotate({ + string: {cacheReadError: e.toString()}, + }); + } data = data ?? this._createEmptyMap(); this._options.perfLogger?.point('read_end');