Introduce a FileSystemCalls.getType() function that just returns the type of a
file in question. In quite a few places that is sufficient and we might be able
to get the result based on a previously existing readdir() or stat() request if
we have either of them cached.
While at it, re-use the PerBuildSysCall cache inside of FileStateFunction in
order to profit from this.
This can prevent a whole bunch of unnecessary stat() calls, especially for
whether or not a BUILD file is present and for creating the FileStateValue for
symlinks and directories (for regular files we still need to stat() in order to
get modification time information).
RELNOTES: None.
PiperOrigin-RevId: 240794051
diff --git a/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorIOTest.java b/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorIOTest.java
index 540760d..3a3e4d2 100644
--- a/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorIOTest.java
+++ b/src/test/java/com/google/devtools/build/lib/pkgcache/TargetPatternEvaluatorIOTest.java
@@ -95,6 +95,7 @@
@Test
public void testBadStatKeepGoing() throws Exception {
reporter.removeHandler(failFastHandler);
+ getSkyframeExecutor().turnOffSyscallCacheForTesting();
// Given a package, "parent",
Path parent = scratch.file("parent/BUILD", "sh_library(name = 'parent')").getParentDirectory();
// And a child, "badstat",
@@ -123,6 +124,7 @@
@Test
public void testBadReaddirKeepGoing() throws Exception {
reporter.removeHandler(failFastHandler);
+ skyframeExecutor.turnOffSyscallCacheForTesting();
// Given a package, "parent",
Path parent = scratch.file("parent/BUILD", "sh_library(name = 'parent')").getParentDirectory();
// And a child, "badstat",
diff --git a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
index 568fd31..4786753 100644
--- a/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
+++ b/src/test/java/com/google/devtools/build/lib/repository/ExternalPackageUtilTest.java
@@ -57,6 +57,7 @@
import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor;
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.RootedPath;
+import com.google.devtools.build.lib.vfs.UnixGlob;
import com.google.devtools.build.skyframe.AbstractSkyKey;
import com.google.devtools.build.skyframe.EvaluationContext;
import com.google.devtools.build.skyframe.EvaluationResult;
@@ -125,7 +126,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
RuleClassProvider ruleClassProvider = analysisMock.createRuleClassProvider();
skyFunctions.put(SkyFunctions.WORKSPACE_AST, new WorkspaceASTFunction(ruleClassProvider));
diff --git a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
index 6c8df45..02ec42d 100644
--- a/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/rules/repository/RepositoryDelegatorTest.java
@@ -51,6 +51,7 @@
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.lib.vfs.UnixGlob;
import com.google.devtools.build.skyframe.EvaluationContext;
import com.google.devtools.build.skyframe.EvaluationResult;
import com.google.devtools.build.skyframe.InMemoryMemoizingEvaluator;
@@ -109,7 +110,9 @@
.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper))
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper))
.put(FileValue.FILE, new FileFunction(pkgLocator))
.put(SkyFunctions.REPOSITORY_DIRECTORY, delegatorFunction)
.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
index 8c02f4d..fb9be8f 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTestCase.java
@@ -35,6 +35,7 @@
import com.google.devtools.build.lib.vfs.FileSystemUtils;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.Root;
+import com.google.devtools.build.lib.vfs.UnixGlob;
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
import com.google.devtools.build.skyframe.InMemoryMemoizingEvaluator;
import com.google.devtools.build.skyframe.MemoizingEvaluator;
@@ -97,7 +98,9 @@
.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper))
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper))
.put(FileValue.FILE, new FileFunction(pkgLocator))
.put(Artifact.ARTIFACT, new ArtifactFunction(() -> true))
.put(SkyFunctions.ACTION_EXECUTION, new SimpleActionExecutionFunction())
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
index 1739a30..d560875 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ContainingPackageLookupFunctionTest.java
@@ -121,7 +121,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
skyFunctions.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
index a99ca6f..8438650 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FileFunctionTest.java
@@ -67,6 +67,7 @@
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.lib.vfs.UnixGlob;
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
import com.google.devtools.build.lib.vfs.util.FileSystems;
import com.google.devtools.build.skyframe.BuildDriver;
@@ -163,7 +164,9 @@
.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper))
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper))
.put(
SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS,
new FileSymlinkCycleUniquenessFunction())
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
index f24ec73..66d3ddf 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesetEntryFunctionTest.java
@@ -106,7 +106,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
skyFunctions.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
index 79cd067..5aa5a69 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/FilesystemValueCheckerTest.java
@@ -64,6 +64,7 @@
import com.google.devtools.build.lib.vfs.Root;
import com.google.devtools.build.lib.vfs.RootedPath;
import com.google.devtools.build.lib.vfs.Symlinks;
+import com.google.devtools.build.lib.vfs.UnixGlob;
import com.google.devtools.build.lib.vfs.inmemoryfs.InMemoryFileSystem;
import com.google.devtools.build.skyframe.Differencer.Diff;
import com.google.devtools.build.skyframe.EvaluationContext;
@@ -137,7 +138,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(
SkyFunctions.FILE_SYMLINK_CYCLE_UNIQUENESS, new FileSymlinkCycleUniquenessFunction());
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
index d57d25e..fdfb58e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/GlobFunctionTest.java
@@ -179,7 +179,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
skyFunctions.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
index 46e5e5f..162f84e 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/LocalRepositoryLookupFunctionTest.java
@@ -99,7 +99,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
skyFunctions.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
index d6ead22..06c8a81 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageFunctionTest.java
@@ -199,6 +199,7 @@
@Test
public void testPropagatesFilesystemInconsistencies_Globbing() throws Exception {
+ getSkyframeExecutor().turnOffSyscallCacheForTesting();
reporter.removeHandler(failFastHandler);
RecordingDifferencer differencer = getSkyframeExecutor().getDifferencerForTesting();
Root pkgRoot = getSkyframeExecutor().getPathEntries().get(0);
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
index 30ac67f..022867a 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/PackageLookupFunctionTest.java
@@ -126,7 +126,9 @@
skyFunctions.put(
FileStateValue.FILE_STATE,
new FileStateFunction(
- new AtomicReference<TimestampGranularityMonitor>(), externalFilesHelper));
+ new AtomicReference<TimestampGranularityMonitor>(),
+ new AtomicReference(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
skyFunctions.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
index 4ff3220..3f5c4cf 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java
@@ -130,7 +130,10 @@
Map<SkyFunctionName, SkyFunction> skyFunctions = new HashMap<>();
skyFunctions.put(
FileStateValue.FILE_STATE,
- new FileStateFunction(new AtomicReference<>(), externalFilesHelper));
+ new FileStateFunction(
+ new AtomicReference<>(),
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper));
skyFunctions.put(FileValue.FILE, new FileFunction(pkgLocator));
skyFunctions.put(SkyFunctions.DIRECTORY_LISTING, new DirectoryListingFunction());
skyFunctions.put(
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
index 1756184..1903208 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeLabelVisitorTest.java
@@ -444,6 +444,7 @@
@Test
public void testRootCauseOnInconsistentFilesystem() throws Exception {
reporter.removeHandler(failFastHandler);
+ skyframeExecutor.turnOffSyscallCacheForTesting();
scratch.file("foo/BUILD", "sh_library(name = 'foo', deps = ['//bar:baz/fizz'])");
Path barBuildFile = scratch.file("bar/BUILD", "sh_library(name = 'bar/baz')");
scratch.file("bar/baz/BUILD");
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
index 09c1d90..8e7b27c 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TimestampBuilderTestCase.java
@@ -88,6 +88,7 @@
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.UnixGlob;
import com.google.devtools.build.skyframe.CycleInfo;
import com.google.devtools.build.skyframe.ErrorInfo;
import com.google.devtools.build.skyframe.EvaluationContext;
@@ -216,7 +217,12 @@
final InMemoryMemoizingEvaluator evaluator =
new InMemoryMemoizingEvaluator(
ImmutableMap.<SkyFunctionName, SkyFunction>builder()
- .put(FileStateValue.FILE_STATE, new FileStateFunction(tsgmRef, externalFilesHelper))
+ .put(
+ FileStateValue.FILE_STATE,
+ new FileStateFunction(
+ tsgmRef,
+ new AtomicReference<>(UnixGlob.DEFAULT_SYSCALLS),
+ externalFilesHelper))
.put(FileValue.FILE, new FileFunction(pkgLocator))
.put(Artifact.ARTIFACT, new ArtifactFunction(() -> true))
.put(
diff --git a/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java b/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java
index c86ee3f..aba451c 100644
--- a/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java
+++ b/src/test/java/com/google/devtools/build/lib/vfs/GlobTest.java
@@ -197,17 +197,23 @@
@Test
public void testIOFailureOnStat() throws Exception {
- UnixGlob.FilesystemCalls syscalls = new UnixGlob.FilesystemCalls() {
- @Override
- public FileStatus statIfFound(Path path, Symlinks symlinks) throws IOException {
- throw new IOException("EIO");
- }
+ UnixGlob.FilesystemCalls syscalls =
+ new UnixGlob.FilesystemCalls() {
+ @Override
+ public FileStatus statIfFound(Path path, Symlinks symlinks) throws IOException {
+ throw new IOException("EIO");
+ }
- @Override
- public Collection<Dirent> readdir(Path path, Symlinks symlinks) {
- throw new IllegalStateException();
- }
- };
+ @Override
+ public Collection<Dirent> readdir(Path path, Symlinks symlinks) {
+ throw new IllegalStateException();
+ }
+
+ @Override
+ public Dirent.Type getType(Path path, Symlinks symlinks) {
+ throw new IllegalStateException();
+ }
+ };
try {
new UnixGlob.Builder(tmpPath)
@@ -222,17 +228,23 @@
@Test
public void testGlobWithoutWildcardsDoesNotCallReaddir() throws Exception {
- UnixGlob.FilesystemCalls syscalls = new UnixGlob.FilesystemCalls() {
- @Override
- public FileStatus statIfFound(Path path, Symlinks symlinks) throws IOException {
- return UnixGlob.DEFAULT_SYSCALLS.statIfFound(path, symlinks);
- }
+ UnixGlob.FilesystemCalls syscalls =
+ new UnixGlob.FilesystemCalls() {
+ @Override
+ public FileStatus statIfFound(Path path, Symlinks symlinks) throws IOException {
+ return UnixGlob.DEFAULT_SYSCALLS.statIfFound(path, symlinks);
+ }
- @Override
- public Collection<Dirent> readdir(Path path, Symlinks symlinks) {
- throw new IllegalStateException();
- }
- };
+ @Override
+ public Collection<Dirent> readdir(Path path, Symlinks symlinks) {
+ throw new IllegalStateException();
+ }
+
+ @Override
+ public Dirent.Type getType(Path path, Symlinks symlinks) {
+ throw new IllegalStateException();
+ }
+ };
assertThat(
new UnixGlob.Builder(tmpPath)