aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
authorGravatar Ulf Adams <ulfjack@google.com>2015-09-26 09:51:39 +0000
committerGravatar Han-Wen Nienhuys <hanwen@google.com>2015-09-28 11:39:52 +0000
commit003fe96262be45e600ccba6c687dc6b770f734cf (patch)
treefade1996bbfd70739c2045abb50595e741d29fe5 /src/main/java/com/google/devtools/build/lib/skyframe
parent84863a90a026585c3a725e8b1f4d73338c54df6a (diff)
Move the remaining state from BuildView to SkyframeBuildView.
-- MOS_MIGRATED_REVID=104009600
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java45
1 files changed, 44 insertions, 1 deletions
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;
* <p>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<Set<Class<? extends BuildConfiguration.Fragment>>, 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) {
@@ -135,13 +148,31 @@ public final class SkyframeBuildView {
}
/**
+ * 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.
*
* <p>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<ConfiguredTarget> topLevelTargets) {
+ // TODO(bazel-team): Consider clearing packages too to save more memory.
+ skyframeAnalysisWasDiscarded = true;
+ skyframeExecutor.clearAnalysisCache(topLevelTargets);
+ }
+
private void setDeserializedArtifactOwners() throws ViewCreationFailedException {
Map<PathFragment, Artifact> deserializedArtifactMap =
artifactFactory.getDeserializedArtifacts();