Do not necessarily watch for changes under '/'.
Before, we requested the root of external repositories using a Root of '/', which made Bazel climb up the directory tree until '/' when resolving symlinks when statting the locations where remote repositories are fetched. This is something that is not done for the main repository.
For the sake of efficiency and consistency, treat the actual location of external repositories the same as the main repository and do not register paths above their roots in Skyframe.
In addition, special-case the `@bazel_tools` repository so that the aforementioned ascent does not happen for its source (which should happen for every ther local repository).
RELNOTES: None.
PiperOrigin-RevId: 447409159
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
index 4709d5c..22f135a 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/LocalRepositoryFunction.java
@@ -50,7 +50,7 @@
Path targetPath = directories.getWorkspace().getRelative(userDefinedPath);
RepositoryDirectoryValue.Builder result =
RepositoryDelegatorFunction.symlinkRepoRoot(
- outputDirectory, targetPath, userDefinedPath, env);
+ directories, outputDirectory, targetPath, userDefinedPath, env);
if (result != null) {
env.getListener().post(resolve(rule, directories));
}
diff --git a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
index 21bd2ec..a49a67c 100644
--- a/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorFunction.java
@@ -136,7 +136,11 @@
}
public static RepositoryDirectoryValue.Builder symlinkRepoRoot(
- Path source, Path destination, String userDefinedPath, Environment env)
+ BlazeDirectories directories,
+ Path source,
+ Path destination,
+ String userDefinedPath,
+ Environment env)
throws RepositoryFunctionException, InterruptedException {
try {
source.createSymbolicLink(destination);
@@ -153,8 +157,17 @@
// Check that the target directory exists and is a directory.
// Note that we have to check `destination` and not `source` here, otherwise we'd have a
// circular dependency between SkyValues.
- RootedPath targetDirRootedPath =
- RootedPath.toRootedPath(Root.absoluteRoot(destination.getFileSystem()), destination);
+ RootedPath targetDirRootedPath;
+ if (destination.startsWith(directories.getInstallBase())) {
+ // The install base only changes with the Bazel binary so it's acceptable not to add its
+ // ancestors as Skyframe dependencies.
+ targetDirRootedPath =
+ RootedPath.toRootedPath(Root.fromPath(destination), PathFragment.EMPTY_FRAGMENT);
+ } else {
+ targetDirRootedPath =
+ RootedPath.toRootedPath(Root.absoluteRoot(destination.getFileSystem()), destination);
+ }
+
FileValue targetDirValue;
try {
targetDirValue =
@@ -472,7 +485,11 @@
setupRepositoryRoot(repoRoot);
RepositoryDirectoryValue.Builder directoryValue =
symlinkRepoRoot(
- repoRoot, directories.getWorkspace().getRelative(sourcePath), pathAttr, env);
+ directories,
+ repoRoot,
+ directories.getWorkspace().getRelative(sourcePath),
+ pathAttr,
+ env);
if (directoryValue == null) {
return null;
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
index 36ca983..5f865a7 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD
@@ -1293,6 +1293,7 @@
deps = [
":cycle_utils",
"//src/main/java/com/google/devtools/build/lib/actions:file_metadata",
+ "//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/io:file_symlink_cycle_exception",
"//src/main/java/com/google/devtools/build/lib/io:file_symlink_cycle_uniqueness_function",
"//src/main/java/com/google/devtools/build/lib/io:file_symlink_exception",
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java
index 1ba4d52..88128b1 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileFunction.java
@@ -21,6 +21,7 @@
import com.google.devtools.build.lib.actions.FileStateType;
import com.google.devtools.build.lib.actions.FileStateValue;
import com.google.devtools.build.lib.actions.FileValue;
+import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.io.FileSymlinkCycleException;
import com.google.devtools.build.lib.io.FileSymlinkCycleUniquenessFunction;
import com.google.devtools.build.lib.io.FileSymlinkException;
@@ -30,6 +31,7 @@
import com.google.devtools.build.lib.util.Pair;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
+import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.skyframe.SkyFunction;
import com.google.devtools.build.skyframe.SkyFunctionException;
@@ -49,9 +51,15 @@
*/
public class FileFunction implements SkyFunction {
private final AtomicReference<PathPackageLocator> pkgLocator;
+ private final ImmutableList<Root> immutablePaths;
- public FileFunction(AtomicReference<PathPackageLocator> pkgLocator) {
+ public FileFunction(
+ AtomicReference<PathPackageLocator> pkgLocator, BlazeDirectories directories) {
this.pkgLocator = pkgLocator;
+ this.immutablePaths =
+ ImmutableList.of(
+ Root.fromPath(directories.getOutputBase()),
+ Root.fromPath(directories.getInstallBase()));
}
private static class SymlinkResolutionState {
@@ -142,7 +150,11 @@
}
private RootedPath toRootedPath(Path path) {
- return RootedPath.toRootedPathMaybeUnderRoot(path, pkgLocator.get().getPathEntries());
+ // We check whether the path to be transformed is under the output base or the install base.
+ // These directories are under the control of Bazel and it therefore does not make much sense
+ // to check for changes in them or in their ancestors in the usual Skyframe way.
+ return RootedPath.toRootedPathMaybeUnderRoot(
+ path, Iterables.concat(pkgLocator.get().getPathEntries(), immutablePaths));
}
/**
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 eec580a..5706be1 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
@@ -503,7 +503,7 @@
map.put(
FileSymlinkInfiniteExpansionUniquenessFunction.NAME,
new FileSymlinkInfiniteExpansionUniquenessFunction());
- map.put(FileValue.FILE, new FileFunction(pkgLocator));
+ map.put(FileValue.FILE, new FileFunction(pkgLocator, directories));
map.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
map.put(
SkyFunctions.PACKAGE_LOOKUP,
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
index 79ee882..9322917 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/packages/AbstractPackageLoader.java
@@ -464,7 +464,7 @@
.put(
FileSymlinkInfiniteExpansionUniquenessFunction.NAME,
new FileSymlinkInfiniteExpansionUniquenessFunction())
- .put(FileValue.FILE, new FileFunction(pkgLocatorRef))
+ .put(FileValue.FILE, new FileFunction(pkgLocatorRef, directories))
.put(
SkyFunctions.PACKAGE_LOOKUP,
new PackageLookupFunction(
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
index ecb9c76..73a575c 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/RootedPath.java
@@ -72,8 +72,8 @@
}
/**
- * Returns a rooted path representing {@code path} under one of the package roots, or under the
- * filesystem root if it's not under any package root.
+ * Returns a rooted path representing {@code path} under one of the specified roots, or under the
+ * file system root if it's not under any of the roots in {@code packagePathRoots}.
*/
public static RootedPath toRootedPathMaybeUnderRoot(Path path, Iterable<Root> packagePathRoots) {
for (Root root : packagePathRoots) {