Reintroduce an inconsistency check (albeit, in a weaker form) removed by a previous change that was trying to optimize away a filesystem call.

--
MOS_MIGRATED_REVID=104246368
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileContentsProxy.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileContentsProxy.java
index d49119c..3c3403e8 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileContentsProxy.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileContentsProxy.java
@@ -61,6 +61,10 @@
 
   @Override
   public String toString() {
-    return "mtime: " + mtime + " valueId: " + valueId;
+    return prettyPrint();
+  }
+
+  public String prettyPrint() {
+    return String.format("mtime of %d and nodeId of %d", mtime, valueId);
   }
 }
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 b0c08ad..1255600 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
@@ -59,7 +59,7 @@
   @Override
   public SkyValue compute(SkyKey skyKey, Environment env) throws FileFunctionException {
     RootedPath rootedPath = (RootedPath) skyKey.argument();
-    RootedPath realRootedPath = rootedPath;
+    RootedPath realRootedPath = null;
     FileStateValue realFileStateValue = null;
     PathFragment relativePath = rootedPath.getRelativePath();
 
@@ -83,7 +83,16 @@
       return null;
     }
     if (realFileStateValue == null) {
+      realRootedPath = rootedPath;
       realFileStateValue = fileStateValue;
+    } else if (rootedPath.equals(realRootedPath) && !fileStateValue.equals(realFileStateValue)) {
+      String message = String.format(
+          "Some filesystem operations implied %s was a %s but others made us think it was a %s",
+          rootedPath.asPath().getPathString(),
+          fileStateValue.prettyPrint(),
+          realFileStateValue.prettyPrint());
+      throw new FileFunctionException(new InconsistentFilesystemException(message),
+          Transience.TRANSIENT);
     }
 
     ArrayList<RootedPath> symlinkChain = new ArrayList<>();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java
index 4495a46..46a5734 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/FileStateValue.java
@@ -115,6 +115,13 @@
     throw new IllegalStateException();
   }
 
+  @Override
+  public String toString() {
+    return prettyPrint();
+  }
+
+  abstract String prettyPrint();
+
   /**
    * Implementation of {@link FileStateValue} for files that exist.
    *
@@ -212,9 +219,12 @@
     }
 
     @Override
-    public String toString() {
-      return "[size: " + size + " " + (mtime != -1 ? "mtime: " + mtime : "")
-          + (digest != null ? "digest: " + Arrays.toString(digest) : contentsProxy) + "]";
+    public String prettyPrint() {
+      String contents = digest != null
+          ? String.format("digest of ", Arrays.toString(digest))
+          : contentsProxy.prettyPrint();
+      String extra = mtime != -1 ? String.format(" and mtime of %d", mtime) : "";
+      return String.format("regular file with size of %d and %s%s", size, contents, extra);
     }
   }
 
@@ -232,7 +242,7 @@
     }
 
     @Override
-    public String toString() {
+    public String prettyPrint() {
       return "directory";
     }
 
@@ -282,7 +292,7 @@
     }
 
     @Override
-    public String toString() {
+    public String prettyPrint() {
       return "symlink to " + symlinkTarget;
     }
   }
@@ -301,8 +311,8 @@
     }
 
     @Override
-    public String toString() {
-      return "nonexistent";
+    public String prettyPrint() {
+      return "nonexistent path";
     }
 
     // This object is normally a singleton, but deserialization produces copies.