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)