packager: don't keep on using global cache forever if it misses

Summary:
Keep track of the number of cache misses. If we have a series of misses but then we
start seeing hits, then we progressively reset the counter. If there are too many misses, we just give up on the global cache.

Reviewed By: cpojer

Differential Revision: D4326689

fbshipit-source-id: 5606fc860cbb9d7e9e877c0d1dc4e6a6a1cbcd98
This commit is contained in:
Jean Lauliac 2016-12-14 08:27:31 -08:00 committed by Facebook Github Bot
parent 8ec774396c
commit 1f07e89538
1 changed files with 21 additions and 1 deletions

View File

@ -32,6 +32,12 @@ import type Cache from './Cache';
import type DependencyGraphHelpers from './DependencyGraph/DependencyGraphHelpers'; import type DependencyGraphHelpers from './DependencyGraph/DependencyGraphHelpers';
import type ModuleCache from './ModuleCache'; 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 = { type ReadResult = {
code: string, code: string,
dependencies?: ?Array<string>, dependencies?: ?Array<string>,
@ -78,6 +84,7 @@ class Module {
_readPromises: Map<string, Promise<ReadResult>>; _readPromises: Map<string, Promise<ReadResult>>;
static _globalCacheRetries: number; static _globalCacheRetries: number;
static _globalCacheMaxMisses: number;
constructor({ constructor({
file, file,
@ -261,7 +268,9 @@ class Module {
callback: (error: ?Error, result: ?TransformedCode) => void, callback: (error: ?Error, result: ?TransformedCode) => void,
) { ) {
const globalCache = GlobalTransformCache.get(); 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); this._transformCodeForCallback(cacheProps, callback);
return; return;
} }
@ -280,9 +289,19 @@ class Module {
} }
} }
if (globalCachedResult == null) { 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); this._transformAndStoreCodeGlobally(cacheProps, globalCache, callback);
return; return;
} }
if (Module._globalCacheMaxMisses < GLOBAL_CACHE_MAX_MISSES) {
++Module._globalCacheMaxMisses;
}
callback(undefined, globalCachedResult); callback(undefined, globalCachedResult);
}); });
} }
@ -382,6 +401,7 @@ class Module {
} }
Module._globalCacheRetries = 4; Module._globalCacheRetries = 4;
Module._globalCacheMaxMisses = GLOBAL_CACHE_MAX_MISSES;
// use weak map to speed up hash creation of known objects // use weak map to speed up hash creation of known objects
const knownHashes = new WeakMap(); const knownHashes = new WeakMap();