Weave the trimming cache into Skyframe, but do not use it yet.
Final preparations for the retroactive trimming prototype.
Progress on #6524.
PiperOrigin-RevId: 244960626
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
index bc0e621..0c3961e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetFunction.java
@@ -39,6 +39,7 @@
import com.google.devtools.build.lib.analysis.TargetAndConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiffForReconstruction;
import com.google.devtools.build.lib.analysis.config.ConfigMatchingProvider;
import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
import com.google.devtools.build.lib.analysis.config.InvalidConfigurationException;
@@ -72,6 +73,7 @@
import com.google.devtools.build.lib.skyframe.AspectFunction.AspectCreationException;
import com.google.devtools.build.lib.skyframe.SkyframeExecutor.BuildViewProvider;
import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import com.google.devtools.build.lib.skyframe.trimming.TrimmedConfigurationCache;
import com.google.devtools.build.lib.syntax.EvalException;
import com.google.devtools.build.lib.util.OrderedSetMultimap;
import com.google.devtools.build.skyframe.SkyFunction;
@@ -150,6 +152,9 @@
private final boolean shouldUnblockCpuWorkWhenFetchingDeps;
+ private final TrimmedConfigurationCache<SkyKey, Label, OptionsDiffForReconstruction>
+ configuredTargetCache;
+
ConfiguredTargetFunction(
BuildViewProvider buildViewProvider,
RuleClassProvider ruleClassProvider,
@@ -158,7 +163,9 @@
boolean shouldUnblockCpuWorkWhenFetchingDeps,
BuildOptions defaultBuildOptions,
@Nullable ConfiguredTargetProgressReceiver configuredTargetProgress,
- Supplier<BigInteger> nonceVersion) {
+ Supplier<BigInteger> nonceVersion,
+ TrimmedConfigurationCache<SkyKey, Label, OptionsDiffForReconstruction>
+ configuredTargetCache) {
this.buildViewProvider = buildViewProvider;
this.ruleClassProvider = ruleClassProvider;
this.cpuBoundSemaphore = cpuBoundSemaphore;
@@ -168,6 +175,7 @@
this.defaultBuildOptions = defaultBuildOptions;
this.configuredTargetProgress = configuredTargetProgress;
this.nonceVersion = nonceVersion;
+ this.configuredTargetCache = configuredTargetCache;
}
private void acquireWithLogging(SkyKey key) throws InterruptedException {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index 3cf640c..36e459a 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -305,6 +305,12 @@
skyframeExecutor.handleAnalysisInvalidatingChange();
}
}
+ if (configurations.getTargetConfigurations().stream()
+ .anyMatch(BuildConfiguration::trimConfigurationsRetroactively)) {
+ skyframeExecutor.activateRetroactiveTrimming();
+ } else {
+ skyframeExecutor.deactivateRetroactiveTrimming();
+ }
skyframeAnalysisWasDiscarded = false;
this.configurations = configurations;
setTopLevelHostConfiguration(configurations.getHostConfiguration());
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 b6450dc..fe10629 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
@@ -75,6 +75,7 @@
import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.config.BuildConfigurationCollection;
import com.google.devtools.build.lib.analysis.config.BuildOptions;
+import com.google.devtools.build.lib.analysis.config.BuildOptions.OptionsDiffForReconstruction;
import com.google.devtools.build.lib.analysis.config.ConfigurationResolver;
import com.google.devtools.build.lib.analysis.config.FragmentClassSet;
import com.google.devtools.build.lib.analysis.config.HostTransition;
@@ -142,6 +143,7 @@
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ActionCompletedReceiver;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ProgressSupplier;
import com.google.devtools.build.lib.skyframe.TargetPatternValue.TargetPatternKey;
+import com.google.devtools.build.lib.skyframe.trimming.TrimmedConfigurationCache;
import com.google.devtools.build.lib.syntax.StarlarkSemantics;
import com.google.devtools.build.lib.util.AbruptExitException;
import com.google.devtools.build.lib.util.ResourceUsage;
@@ -329,6 +331,11 @@
@Nullable private final NonexistentFileReceiver nonexistentFileReceiver;
private final MutableSupplier<BigInteger> nonceVersion = new MutableSupplier<>();
+ private final TrimmedConfigurationCache<SkyKey, Label, OptionsDiffForReconstruction>
+ trimmingCache = TrimmedConfigurationProgressReceiver.buildCache();
+ private final TrimmedConfigurationProgressReceiver trimmingListener =
+ new TrimmedConfigurationProgressReceiver(trimmingCache);
+
/** An {@link ArtifactResolverSupplier} that supports setting of an {@link ArtifactFactory}. */
public static class MutableArtifactFactorySupplier implements ArtifactResolverSupplier {
@@ -534,7 +541,8 @@
shouldUnblockCpuWorkWhenFetchingDeps,
defaultBuildOptions,
configuredTargetProgress,
- nonceVersion));
+ nonceVersion,
+ trimmingCache));
map.put(
SkyFunctions.ASPECT,
new AspectFunction(
@@ -797,6 +805,7 @@
public void resetEvaluator() {
init();
emittedEventState.clear();
+ clearTrimmingCache();
skyframeBuildView.reset();
}
@@ -817,10 +826,25 @@
public void handleAnalysisInvalidatingChange() {
logger.info("Dropping configured target data");
analysisCacheDiscarded = true;
+ clearTrimmingCache();
skyframeBuildView.clearInvalidatedConfiguredTargets();
skyframeBuildView.clearLegacyData();
}
+ /** Activates retroactive trimming (idempotently, so has no effect if already active). */
+ void activateRetroactiveTrimming() {
+ trimmingListener.activate();
+ }
+
+ /** Deactivates retroactive trimming (idempotently, so has no effect if already inactive). */
+ void deactivateRetroactiveTrimming() {
+ trimmingListener.deactivate();
+ }
+
+ protected void clearTrimmingCache() {
+ trimmingCache.clear();
+ }
+
/** Used with dump --rules. */
public static class RuleStat {
private final String key;
@@ -2798,6 +2822,7 @@
/** This receiver is only needed for loading, so it is null otherwise. */
@Override
public void invalidated(SkyKey skyKey, InvalidationState state) {
+ trimmingListener.invalidated(skyKey, state);
if (ignoreInvalidations) {
return;
}
@@ -2806,6 +2831,7 @@
@Override
public void enqueueing(SkyKey skyKey) {
+ trimmingListener.enqueueing(skyKey);
if (ignoreInvalidations) {
return;
}
@@ -2821,6 +2847,7 @@
@Nullable SkyValue value,
Supplier<EvaluationSuccessState> evaluationSuccessState,
EvaluationState state) {
+ trimmingListener.evaluated(skyKey, value, evaluationSuccessState, state);
if (ignoreInvalidations) {
return;
}