From 003fe96262be45e600ccba6c687dc6b770f734cf Mon Sep 17 00:00:00 2001 From: Ulf Adams Date: Sat, 26 Sep 2015 09:51:39 +0000 Subject: Move the remaining state from BuildView to SkyframeBuildView. -- MOS_MIGRATED_REVID=104009600 --- .../devtools/build/lib/analysis/BuildView.java | 29 ++------------ .../build/lib/skyframe/SkyframeBuildView.java | 45 +++++++++++++++++++++- 2 files changed, 47 insertions(+), 27 deletions(-) (limited to 'src/main/java/com/google/devtools/build/lib') diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index 05c8377bb1..08b5d6601a 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -214,8 +214,6 @@ public class BuildView { // Same as skyframeExecutor.getPackageManager(). private final LoadedPackageProvider packageManager; - private BuildConfigurationCollection configurations; - private final ConfiguredRuleClassProvider ruleClassProvider; /** @@ -223,12 +221,6 @@ public class BuildView { */ @Nullable private final CoverageReportActionFactory coverageReportActionFactory; - /** - * If the last build was executed with {@code Options#discard_analysis_cache} and we are not - * running Skyframe full, we should clear the legacy data since it is out-of-sync. - */ - private boolean skyframeAnalysisWasDiscarded; - @VisibleForTesting public Set getSkyframeEvaluatedTargetKeysForTesting() { return skyframeBuildView.getEvaluatedTargetKeys(); @@ -264,8 +256,7 @@ public class BuildView { */ @VisibleForTesting public void setConfigurationsForTesting(BuildConfigurationCollection configurations) { - this.configurations = configurations; - skyframeBuildView.setTopLevelHostConfiguration(configurations.getHostConfiguration()); + skyframeBuildView.setConfigurations(configurations); } public ArtifactFactory getArtifactFactory() { @@ -560,19 +551,7 @@ public class BuildView { Collection targets = loadingResult.getTargets(); eventBus.post(new AnalysisPhaseStartedEvent(targets)); - // Clear all cached ConfiguredTargets on configuration change. - // TODO(ulfjack): Can we remove this now? - // - // Also if --discard_analysis_cache was used in the last build we want to clear the legacy - // data. - if ((this.configurations != null && !configurations.equals(this.configurations)) - || skyframeAnalysisWasDiscarded) { - LOG.info("Discarding analysis cache: configurations have changed."); - skyframeExecutor.dropConfiguredTargets(); - } - skyframeAnalysisWasDiscarded = false; - this.configurations = configurations; - skyframeBuildView.setTopLevelHostConfiguration(this.configurations.getHostConfiguration()); + skyframeBuildView.setConfigurations(configurations); // Determine the configurations. List nodes = nodesForTargets(configurations, targets); @@ -1008,8 +987,6 @@ public class BuildView { * @see BuildView.Options#discardAnalysisCache */ public void clearAnalysisCache(Collection topLevelTargets) { - // TODO(bazel-team): Consider clearing packages too to save more memory. - skyframeAnalysisWasDiscarded = true; - skyframeExecutor.clearAnalysisCache(topLevelTargets); + skyframeBuildView.clearAnalysisCache(topLevelTargets); } } 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 de2d7338bc..22e272e9fe 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 @@ -13,6 +13,7 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.base.Supplier; import com.google.common.collect.ImmutableList; @@ -35,6 +36,7 @@ import com.google.devtools.build.lib.analysis.AnalysisEnvironment; import com.google.devtools.build.lib.analysis.AnalysisFailureEvent; import com.google.devtools.build.lib.analysis.Aspect; import com.google.devtools.build.lib.analysis.BlazeDirectories; +import com.google.devtools.build.lib.analysis.BuildView; import com.google.devtools.build.lib.analysis.CachingAnalysisEnvironment; import com.google.devtools.build.lib.analysis.ConfiguredAspectFactory; import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider; @@ -47,6 +49,7 @@ import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory; import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildInfoKey; import com.google.devtools.build.lib.analysis.config.BinTools; 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.ConfigMatchingProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder; @@ -77,6 +80,7 @@ import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.logging.Logger; import javax.annotation.Nullable; @@ -86,6 +90,7 @@ import javax.annotation.Nullable; *

Covers enough functionality to work as a substitute for {@code BuildView#configureTargets}. */ public final class SkyframeBuildView { + private static Logger LOG = Logger.getLogger(BuildView.class.getName()); private final ConfiguredTargetFactory factory; private final ArtifactFactory artifactFactory; @@ -116,6 +121,14 @@ public final class SkyframeBuildView { private Map>, BuildConfiguration> hostConfigurationCache = Maps.newConcurrentMap(); + private BuildConfigurationCollection configurations; + + /** + * If the last build was executed with {@code Options#discard_analysis_cache} and we are not + * running Skyframe full, we should clear the legacy data since it is out-of-sync. + */ + private boolean skyframeAnalysisWasDiscarded; + public SkyframeBuildView(BlazeDirectories directories, SkyframeExecutor skyframeExecutor, BinTools binTools, ConfiguredRuleClassProvider ruleClassProvider) { @@ -134,6 +147,24 @@ public final class SkyframeBuildView { return ImmutableSet.copyOf(evaluatedConfiguredTargets); } + /** + * Sets the configurations. Not thread-safe. DO NOT CALL except from tests! + */ + @VisibleForTesting + public void setConfigurations(BuildConfigurationCollection configurations) { + // Clear all cached ConfiguredTargets on configuration change of if --discard_analysis_cache + // was set on the previous build. In the former case, it's not required for correctness, but + // prevents unbounded memory usage. + if ((this.configurations != null && !configurations.equals(this.configurations)) + || skyframeAnalysisWasDiscarded) { + LOG.info("Discarding analysis cache: configurations have changed."); + skyframeExecutor.dropConfiguredTargets(); + } + skyframeAnalysisWasDiscarded = false; + this.configurations = configurations; + setTopLevelHostConfiguration(configurations.getHostConfiguration()); + } + /** * Sets the host configuration consisting of all fragments that will be used by the top level * targets' transitive closures. @@ -141,7 +172,7 @@ public final class SkyframeBuildView { *

This is used to power {@link #getHostConfiguration} during analysis, which computes * fragment-trimmed host configurations from the top-level one. */ - public void setTopLevelHostConfiguration(BuildConfiguration topLevelHostConfiguration) { + private void setTopLevelHostConfiguration(BuildConfiguration topLevelHostConfiguration) { if (topLevelHostConfiguration.equals(this.topLevelHostConfiguration)) { return; } @@ -149,6 +180,18 @@ public final class SkyframeBuildView { this.topLevelHostConfiguration = topLevelHostConfiguration; } + /** + * Drops the analysis cache. If building with Skyframe, targets in {@code topLevelTargets} may + * remain in the cache for use during the execution phase. + * + * @see com.google.devtools.build.lib.analysis.BuildView.Options#discardAnalysisCache + */ + public void clearAnalysisCache(Collection topLevelTargets) { + // TODO(bazel-team): Consider clearing packages too to save more memory. + skyframeAnalysisWasDiscarded = true; + skyframeExecutor.clearAnalysisCache(topLevelTargets); + } + private void setDeserializedArtifactOwners() throws ViewCreationFailedException { Map deserializedArtifactMap = artifactFactory.getDeserializedArtifacts(); -- cgit v1.2.3