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; }