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 =