diff --git a/packager/react-packager/src/node-haste/Module.js b/packager/react-packager/src/node-haste/Module.js index 7bf4976b3..2f914585a 100644 --- a/packager/react-packager/src/node-haste/Module.js +++ b/packager/react-packager/src/node-haste/Module.js @@ -32,6 +32,12 @@ import type Cache from './Cache'; import type DependencyGraphHelpers from './DependencyGraph/DependencyGraphHelpers'; import type ModuleCache from './ModuleCache'; +/** + * If the global cache returns empty that many times, we give up using the + * global cache for that instance. This speeds up the build. + */ +const GLOBAL_CACHE_MAX_MISSES = 250; + type ReadResult = { code: string, dependencies?: ?Array, @@ -78,6 +84,7 @@ class Module { _readPromises: Map>; static _globalCacheRetries: number; + static _globalCacheMaxMisses: number; constructor({ file, @@ -261,7 +268,9 @@ class Module { callback: (error: ?Error, result: ?TransformedCode) => void, ) { const globalCache = GlobalTransformCache.get(); - if (Module._globalCacheRetries <= 0 || globalCache == null) { + const noMoreRetries = Module._globalCacheRetries <= 0; + const tooManyMisses = Module._globalCacheMaxMisses <= 0; + if (globalCache == null || noMoreRetries || tooManyMisses) { this._transformCodeForCallback(cacheProps, callback); return; } @@ -280,9 +289,19 @@ class Module { } } if (globalCachedResult == null) { + --Module._globalCacheMaxMisses; + if (Module._globalCacheMaxMisses === 0) { + terminal.log( + 'warning: global cache is now disabled because it ' + + 'has been missing too many consecutive keys.', + ); + } this._transformAndStoreCodeGlobally(cacheProps, globalCache, callback); return; } + if (Module._globalCacheMaxMisses < GLOBAL_CACHE_MAX_MISSES) { + ++Module._globalCacheMaxMisses; + } callback(undefined, globalCachedResult); }); } @@ -382,6 +401,7 @@ class Module { } Module._globalCacheRetries = 4; +Module._globalCacheMaxMisses = GLOBAL_CACHE_MAX_MISSES; // use weak map to speed up hash creation of known objects const knownHashes = new WeakMap();