Don't wrap FileStatus in FileStatusWithDigestAdapter if the FileStatus is already a FileStatusWithDigest.
PiperOrigin-RevId: 432973802
diff --git a/src/main/java/com/google/devtools/build/lib/actions/FileStateValue.java b/src/main/java/com/google/devtools/build/lib/actions/FileStateValue.java
index 0d01e0d..fd7dbca 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/FileStateValue.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/FileStateValue.java
@@ -100,7 +100,7 @@
}
return createWithStatNoFollow(
rootedPath,
- FileStatusWithDigestAdapter.adapt(stat),
+ Preconditions.checkNotNull(FileStatusWithDigestAdapter.maybeAdapt(stat), rootedPath),
/*digestWillBeInjected=*/ false,
syscallCache,
tsgm);
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
index fb2b06c..9086798 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ActionMetadataHandler.java
@@ -373,7 +373,7 @@
archivedTreeArtifact,
constructFileArtifactValue(
archivedTreeArtifact,
- FileStatusWithDigestAdapter.adapt(statNoFollow),
+ FileStatusWithDigestAdapter.maybeAdapt(statNoFollow),
/*injectedDigest=*/ null));
} else {
logger.atInfo().atMostEvery(5, MINUTES).log(
@@ -402,7 +402,7 @@
// We already have a stat, so no need to call chmod.
return constructFileArtifactValue(
- output, FileStatusWithDigestAdapter.adapt(statNoFollow), digest);
+ output, FileStatusWithDigestAdapter.maybeAdapt(statNoFollow), digest);
}
@Override
@@ -609,7 +609,8 @@
// exists, it was most likely created by the current action. There is a race condition here if
// an external process creates (or modifies) the file between the deletion and this stat,
// which we cannot solve.
- statNoFollow = FileStatusWithDigestAdapter.adapt(pathNoFollow.statIfFound(Symlinks.NOFOLLOW));
+ statNoFollow =
+ FileStatusWithDigestAdapter.maybeAdapt(pathNoFollow.statIfFound(Symlinks.NOFOLLOW));
}
if (statNoFollow == null || !statNoFollow.isSymbolicLink()) {
@@ -637,7 +638,7 @@
// TODO(bazel-team): consider avoiding a 'stat' here when the symlink target hasn't changed
// and is a source file (since changes to those are checked separately).
FileStatus realStat = realRootedPath.asPath().statIfFound(Symlinks.NOFOLLOW);
- FileStatusWithDigest realStatWithDigest = FileStatusWithDigestAdapter.adapt(realStat);
+ FileStatusWithDigest realStatWithDigest = FileStatusWithDigestAdapter.maybeAdapt(realStat);
return fileArtifactValueFromStat(
realRootedPath, realStatWithDigest, digestWillBeInjected, syscallCache, tsgm);
}
diff --git a/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java b/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java
index aa67cde..dcba28b 100644
--- a/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java
+++ b/src/main/java/com/google/devtools/build/lib/vfs/FileStatusWithDigestAdapter.java
@@ -17,14 +17,17 @@
import java.io.IOException;
import javax.annotation.Nullable;
-/**
- * An adapter from FileStatus to FileStatusWithDigest.
- */
+/** An adapter from FileStatus to FileStatusWithDigest. */
public class FileStatusWithDigestAdapter implements FileStatusWithDigest {
private final FileStatus stat;
- public static FileStatusWithDigest adapt(FileStatus stat) {
- return stat == null ? null : new FileStatusWithDigestAdapter(stat);
+ @Nullable
+ public static FileStatusWithDigest maybeAdapt(@Nullable FileStatus stat) {
+ return stat == null
+ ? null
+ : (stat instanceof FileStatusWithDigest)
+ ? (FileStatusWithDigest) stat
+ : new FileStatusWithDigestAdapter(stat);
}
private FileStatusWithDigestAdapter(FileStatus stat) {
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
index 8ee6a23..d5ed2373 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ArtifactFunctionTest.java
@@ -520,7 +520,7 @@
FileArtifactValue noDigest =
ActionMetadataHandler.fileArtifactValueFromArtifact(
output,
- FileStatusWithDigestAdapter.adapt(path.statIfFound(Symlinks.NOFOLLOW)),
+ FileStatusWithDigestAdapter.maybeAdapt(path.statIfFound(Symlinks.NOFOLLOW)),
SyscallCache.NO_CACHE,
null);
FileArtifactValue withDigest =
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 e65c135..ca58d21 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
@@ -190,7 +190,7 @@
FileArtifactValue noDigest =
ActionMetadataHandler.fileArtifactValueFromArtifact(
artifact,
- FileStatusWithDigestAdapter.adapt(path.statIfFound(Symlinks.NOFOLLOW)),
+ FileStatusWithDigestAdapter.maybeAdapt(path.statIfFound(Symlinks.NOFOLLOW)),
SyscallCache.NO_CACHE,
null);
return FileArtifactValue.createFromInjectedDigest(noDigest, path.getDigest());
@@ -251,7 +251,7 @@
List<FileStatusWithDigest> stats = new ArrayList<>();
for (PathFragment pathFrag : paths) {
stats.add(
- FileStatusWithDigestAdapter.adapt(
+ FileStatusWithDigestAdapter.maybeAdapt(
fileSystem.getPath("/").getRelative(pathFrag).statIfFound(Symlinks.NOFOLLOW)));
}
return stats;
@@ -1259,7 +1259,7 @@
List<FileStatusWithDigest> stats = new ArrayList<>();
for (PathFragment pathFrag : paths) {
stats.add(
- FileStatusWithDigestAdapter.adapt(
+ FileStatusWithDigestAdapter.maybeAdapt(
fs.getPath("/").getRelative(pathFrag).statIfFound(Symlinks.NOFOLLOW)));
}
return stats;
@@ -1313,7 +1313,7 @@
FileArtifactValue noDigest =
ActionMetadataHandler.fileArtifactValueFromArtifact(
output,
- FileStatusWithDigestAdapter.adapt(path.statIfFound(Symlinks.NOFOLLOW)),
+ FileStatusWithDigestAdapter.maybeAdapt(path.statIfFound(Symlinks.NOFOLLOW)),
SyscallCache.NO_CACHE,
null);
FileArtifactValue withDigest =
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java
index 057787f..6f862a8 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/TreeArtifactMetadataTest.java
@@ -273,7 +273,7 @@
FileArtifactValue noDigest =
ActionMetadataHandler.fileArtifactValueFromArtifact(
suboutput,
- FileStatusWithDigestAdapter.adapt(path.statIfFound(Symlinks.NOFOLLOW)),
+ FileStatusWithDigestAdapter.maybeAdapt(path.statIfFound(Symlinks.NOFOLLOW)),
SyscallCache.NO_CACHE,
null);
FileArtifactValue withDigest =