aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/skyframe
diff options
context:
space:
mode:
authorGravatar Eric Fellheimer <felly@google.com>2015-11-09 23:54:46 +0000
committerGravatar Damien Martin-Guillerez <dmarting@google.com>2015-11-10 10:28:29 +0000
commite040fe994c2da2b211858f7985fb736962a4499b (patch)
treef5d507566c2a06cb0984b716170a8ffbcc535058 /src/main/java/com/google/devtools/build/lib/skyframe
parent0f7ee4cbc111209115d7d72430a677f20f22fbd5 (diff)
Add a Skyframe injected value representing a Blacklist of package patterns. Any Package name starting with a blacklisted prefix is treated as a deleted package.
Note the relation to prior art in Blaze: 1. Deleted packages indicates to Blaze to pretend certain packages do not exist. The deleted packages are passed in as fully resolved package names. This is important because the invalidation logic when these values changes references the exact package names, as opposed to prefix patterns. 2. Negative patterns in target parsing. (eg, "foo/..., -foo/bar/..."). Note that if //foo:biz depends on //foo/bar:bang, we still visit that dependency. In other words, the negative patterns just control the target pattern parsing, but not the later evaluation of those targets. Blacklisting acts like both (1) and (2), but in the form of a Precomputed injected value (so modifying the value would be more expensive than modifying deleted_packages). -- MOS_MIGRATED_REVID=107431993
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/skyframe')
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java12
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java7
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java10
4 files changed, 33 insertions, 1 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
index 903d99e687..3a4f7d66d9 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageLookupFunction.java
@@ -73,6 +73,18 @@ public class PackageLookupFunction implements SkyFunction {
return PackageLookupValue.DELETED_PACKAGE_VALUE;
}
+ ImmutableSet<PathFragment> patterns = PrecomputedValue.BLACKLISTED_PKG_PREFIXES.get(env);
+ if (patterns == null) {
+ return null;
+ }
+
+ PathFragment buildFileFragment = packageKey.getPackageFragment();
+ for (PathFragment pattern : patterns) {
+ if (buildFileFragment.startsWith(pattern)) {
+ return PackageLookupValue.DELETED_PACKAGE_VALUE;
+ }
+ }
+
// TODO(bazel-team): The following is O(n^2) on the number of elements on the package path due
// to having restart the SkyFunction after every new dependency. However, if we try to batch
// the missing value keys, more dependencies than necessary will be declared. This wart can be
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
index 6fb102843f..518b538065 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/PrecomputedValue.java
@@ -19,6 +19,7 @@ import com.google.common.base.Supplier;
import com.google.common.base.Suppliers;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.ImmutableSet;
import com.google.devtools.build.lib.actions.Action;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
@@ -28,6 +29,7 @@ import com.google.devtools.build.lib.analysis.buildinfo.BuildInfoFactory.BuildIn
import com.google.devtools.build.lib.packages.RuleVisibility;
import com.google.devtools.build.lib.pkgcache.PathPackageLocator;
import com.google.devtools.build.lib.skyframe.SkyframeActionExecutor.ConflictException;
+import com.google.devtools.build.lib.vfs.PathFragment;
import com.google.devtools.build.skyframe.Injectable;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyKey;
@@ -75,6 +77,9 @@ public final class PrecomputedValue implements SkyValue {
public static final Precomputed<String> DEFAULTS_PACKAGE_CONTENTS =
new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "default_pkg"));
+ public static final Precomputed<ImmutableSet<PathFragment>> BLACKLISTED_PKG_PREFIXES =
+ new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "blacklisted_pkg_patterns"));
+
public static final Precomputed<RuleVisibility> DEFAULT_VISIBILITY =
new Precomputed<>(new SkyKey(SkyFunctions.PRECOMPUTED, "default_visibility"));
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
index f55de62252..3286908da0 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/RecursiveDirectoryTraversalFunction.java
@@ -17,6 +17,7 @@ import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Lists;
+import com.google.common.collect.Sets;
import com.google.devtools.build.lib.cmdline.PackageIdentifier;
import com.google.devtools.build.lib.cmdline.PackageIdentifier.RepositoryName;
import com.google.devtools.build.lib.events.Event;
@@ -112,7 +113,11 @@ abstract class RecursiveDirectoryTraversalFunction
*/
TReturn visitDirectory(RecursivePkgKey recursivePkgKey, Environment env) {
RootedPath rootedPath = recursivePkgKey.getRootedPath();
- Set<PathFragment> excludedPaths = recursivePkgKey.getExcludedPaths();
+ ImmutableSet<PathFragment> blacklist = PrecomputedValue.BLACKLISTED_PKG_PREFIXES.get(env);
+ if (blacklist == null) {
+ return null;
+ }
+ Set<PathFragment> excludedPaths = Sets.union(recursivePkgKey.getExcludedPaths(), blacklist);
Path root = rootedPath.getRoot();
PathFragment rootRelativePath = rootedPath.getRelativePath();
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 631fc2f599..28ac669e66 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
@@ -500,6 +500,10 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
}
}
+ protected ImmutableSet<PathFragment> getBlacklistedPkgPrefixes() {
+ return ImmutableSet.of();
+ }
+
class BuildViewProvider {
/**
* Returns the current {@link SkyframeBuildView} instance.
@@ -868,6 +872,11 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
@VisibleForTesting // productionVisibility = Visibility.PRIVATE
public abstract void setDeletedPackages(Iterable<PackageIdentifier> pkgs);
+ @VisibleForTesting
+ public final void setBlacklistedPkgPrefixes(ImmutableSet<PathFragment> blacklist) {
+ PrecomputedValue.BLACKLISTED_PKG_PREFIXES.set(injectable(), blacklist);
+ }
+
/**
* Prepares the evaluator for loading.
*
@@ -882,6 +891,7 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
maybeInjectPrecomputedValuesForAnalysis();
setCommandId(commandId);
+ setBlacklistedPkgPrefixes(getBlacklistedPkgPrefixes());
setShowLoadingProgress(showLoadingProgress);
setDefaultVisibility(defaultVisibility);
setupDefaultPackage(defaultsPackageContents);