Clear GlobFunction's Pattern cache at the end of each command. GlobFunction has an unbounded map that was retained for the lifetime of the Blaze server, unnecessarily holding onto memory.
PiperOrigin-RevId: 415273421
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
index 87c87c8..5170a8a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/GlobFunction.java
@@ -46,7 +46,7 @@
*/
public final class GlobFunction implements SkyFunction {
- private final ConcurrentHashMap<String, Pattern> regexPatternCache = new ConcurrentHashMap<>();
+ private ConcurrentHashMap<String, Pattern> regexPatternCache = new ConcurrentHashMap<>();
private final boolean alwaysUseDirListing;
@@ -54,6 +54,10 @@
this.alwaysUseDirListing = alwaysUseDirListing;
}
+ void complete() {
+ this.regexPatternCache = new ConcurrentHashMap<>();
+ }
+
@Override
public SkyValue compute(SkyKey skyKey, Environment env)
throws GlobFunctionException, InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 88470c4..4b3abcf 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -334,6 +334,7 @@
new AtomicReference<>();
protected final SkyframeActionExecutor skyframeActionExecutor;
private ActionExecutionFunction actionExecutionFunction;
+ private GlobFunction globFunction;
protected SkyframeProgressReceiver progressReceiver;
private CyclesReporter cyclesReporter = null;
@@ -513,7 +514,9 @@
new BzlCompileFunction(pkgFactory, getHashFunction()));
map.put(SkyFunctions.STARLARK_BUILTINS, new StarlarkBuiltinsFunction(pkgFactory));
map.put(SkyFunctions.BZL_LOAD, newBzlLoadFunction(ruleClassProvider, pkgFactory));
- map.put(SkyFunctions.GLOB, newGlobFunction());
+ GlobFunction globFunction = newGlobFunction();
+ map.put(SkyFunctions.GLOB, globFunction);
+ this.globFunction = globFunction;
map.put(SkyFunctions.TARGET_PATTERN, new TargetPatternFunction());
map.put(SkyFunctions.PREPARE_DEPS_OF_PATTERNS, new PrepareDepsOfPatternsFunction());
map.put(
@@ -665,7 +668,7 @@
return new DirectoryListingStateFunction(externalFilesHelper, syscalls);
}
- protected SkyFunction newGlobFunction() {
+ protected GlobFunction newGlobFunction() {
return new GlobFunction(/*alwaysUseDirListing=*/ false);
}
@@ -858,6 +861,7 @@
*/
public void notifyCommandComplete(ExtendedEventHandler eventHandler) throws InterruptedException {
memoizingEvaluator.noteEvaluationsAtSameVersionMayBeFinished(eventHandler);
+ globFunction.complete();
}
/**