Move GraphInconsistencyReceiver.Inconsistency to proto for easier reuse.

PiperOrigin-RevId: 297366214
diff --git a/src/BUILD b/src/BUILD
index 4cdadbb..32dd215 100644
--- a/src/BUILD
+++ b/src/BUILD
@@ -481,6 +481,7 @@
         "//src/main/java/com/google/devtools/build/lib/bazel/debug:dist_jars",
         "//src/main/java/com/google/devtools/build/lib/skylarkdebug/proto:dist_jars",
         "//src/main/java/com/google/devtools/build/skydoc/rendering/proto:dist_jars",
+        "//src/main/java/com/google/devtools/build/skyframe:dist_jars",
         "@googleapis//:dist_jars",
         "@remoteapis//:dist_jars",
     ],
diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java
index 574d806..a10e7f9 100644
--- a/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java
@@ -33,7 +33,6 @@
 import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
 import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState;
 import com.google.devtools.build.skyframe.EvaluationProgressReceiver.NodeState;
-import com.google.devtools.build.skyframe.GraphInconsistencyReceiver.Inconsistency;
 import com.google.devtools.build.skyframe.MemoizingEvaluator.EmittedEventState;
 import com.google.devtools.build.skyframe.NodeEntry.DependencyState;
 import com.google.devtools.build.skyframe.NodeEntry.DirtyState;
@@ -43,6 +42,7 @@
 import com.google.devtools.build.skyframe.SkyFunctionEnvironment.UndonePreviouslyRequestedDeps;
 import com.google.devtools.build.skyframe.SkyFunctionException.ReifiedSkyFunctionException;
 import com.google.devtools.build.skyframe.ThinNodeEntry.DirtyType;
+import com.google.devtools.build.skyframe.proto.GraphInconsistency.Inconsistency;
 import java.time.Duration;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -357,7 +357,7 @@
             Sets.difference(ImmutableSet.copyOf(knownChildren), oldChildren.keySet());
         if (!missingChildren.isEmpty()) {
           inconsistencyReceiver.noteInconsistencyAndMaybeThrow(
-              skyKey, missingChildren, Inconsistency.CHILD_MISSING_FOR_DIRTY_NODE);
+              skyKey, missingChildren, Inconsistency.DIRTY_PARENT_HAD_MISSING_CHILD);
         }
         Map<SkyKey, ? extends NodeEntry> recreatedEntries =
             graph.createIfAbsentBatch(skyKey, Reason.ENQUEUING_CHILD, missingChildren);
diff --git a/src/main/java/com/google/devtools/build/skyframe/BUILD b/src/main/java/com/google/devtools/build/skyframe/BUILD
index 78eb455..86dcbca 100644
--- a/src/main/java/com/google/devtools/build/skyframe/BUILD
+++ b/src/main/java/com/google/devtools/build/skyframe/BUILD
@@ -1,4 +1,5 @@
 load("@rules_java//java:defs.bzl", "java_library")
+load("//tools/build_rules:utilities.bzl", "java_library_srcs")
 
 # Description:
 #   Skyframe Java code
@@ -32,6 +33,7 @@
         exclude = SKYFRAME_OBJECT_SRCS,
     ),
     deps = [
+        ":graph_inconsistency_java_proto",
         ":skyframe-objects",
         "//src/main/java/com/google/devtools/build/lib:bug-report",
         "//src/main/java/com/google/devtools/build/lib:events",
@@ -51,6 +53,21 @@
     ],
 )
 
+proto_library(
+    name = "graph_inconsistency",
+    srcs = ["graph_inconsistency.proto"],
+)
+
+java_proto_library(
+    name = "graph_inconsistency_java_proto",
+    deps = [":graph_inconsistency"],
+)
+
+java_library_srcs(
+    name = "dist_jars",
+    deps = [":graph_inconsistency_java_proto"],
+)
+
 filegroup(
     name = "srcs",
     srcs = glob(["**"]),
diff --git a/src/main/java/com/google/devtools/build/skyframe/GraphInconsistencyReceiver.java b/src/main/java/com/google/devtools/build/skyframe/GraphInconsistencyReceiver.java
index adad003..ab83ab2 100644
--- a/src/main/java/com/google/devtools/build/skyframe/GraphInconsistencyReceiver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/GraphInconsistencyReceiver.java
@@ -15,6 +15,7 @@
 package com.google.devtools.build.skyframe;
 
 import com.google.devtools.build.lib.util.StringUtil;
+import com.google.devtools.build.skyframe.proto.GraphInconsistency.Inconsistency;
 import java.util.Collection;
 import javax.annotation.Nullable;
 
@@ -34,16 +35,6 @@
   void noteInconsistencyAndMaybeThrow(
       SkyKey key, @Nullable Collection<SkyKey> otherKeys, Inconsistency inconsistency);
 
-  /** The type of inconsistency detected. */
-  enum Inconsistency {
-    RESET_REQUESTED,
-    CHILD_MISSING_FOR_DIRTY_NODE, // TODO(mschaller): put "parent" before "child" for consistency
-    PARENT_FORCE_REBUILD_OF_CHILD,
-    PARENT_FORCE_REBUILD_OF_MISSING_CHILD,
-    BUILDING_PARENT_FOUND_UNDONE_CHILD,
-    ALREADY_DECLARED_CHILD_MISSING
-  }
-
   /** A {@link GraphInconsistencyReceiver} that crashes on any inconsistency. */
   GraphInconsistencyReceiver THROWING =
       (key, otherKey, inconsistency) -> {
diff --git a/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java b/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java
index 9258fc5..326b9f7 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SimpleCycleDetector.java
@@ -28,6 +28,7 @@
 import com.google.devtools.build.skyframe.ParallelEvaluatorContext.EnqueueParentBehavior;
 import com.google.devtools.build.skyframe.QueryableGraph.Reason;
 import com.google.devtools.build.skyframe.SkyFunctionEnvironment.UndonePreviouslyRequestedDeps;
+import com.google.devtools.build.skyframe.proto.GraphInconsistency.Inconsistency;
 import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.Deque;
@@ -297,9 +298,7 @@
           evaluatorContext
               .getGraphInconsistencyReceiver()
               .noteInconsistencyAndMaybeThrow(
-                  key,
-                  missingChildren,
-                  GraphInconsistencyReceiver.Inconsistency.ALREADY_DECLARED_CHILD_MISSING);
+                  key, missingChildren, Inconsistency.ALREADY_DECLARED_CHILD_MISSING);
           entry.removeUnfinishedDeps(missingChildren);
         }
       }
@@ -393,9 +392,7 @@
       evaluatorContext
           .getGraphInconsistencyReceiver()
           .noteInconsistencyAndMaybeThrow(
-              parent,
-              missingChildren,
-              GraphInconsistencyReceiver.Inconsistency.ALREADY_DECLARED_CHILD_MISSING);
+              parent, missingChildren, Inconsistency.ALREADY_DECLARED_CHILD_MISSING);
     }
     for (NodeEntry childNode : childMap.values()) {
       ErrorInfo errorInfo = childNode.getErrorInfo();
diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
index 08f16ce..cacc76b 100644
--- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
+++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java
@@ -32,10 +32,10 @@
 import com.google.devtools.build.lib.util.GroupedList.GroupedListHelper;
 import com.google.devtools.build.lib.util.Pair;
 import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState;
-import com.google.devtools.build.skyframe.GraphInconsistencyReceiver.Inconsistency;
 import com.google.devtools.build.skyframe.NodeEntry.DependencyState;
 import com.google.devtools.build.skyframe.ParallelEvaluatorContext.EnqueueParentBehavior;
 import com.google.devtools.build.skyframe.QueryableGraph.Reason;
+import com.google.devtools.build.skyframe.proto.GraphInconsistency.Inconsistency;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
diff --git a/src/main/java/com/google/devtools/build/skyframe/graph_inconsistency.proto b/src/main/java/com/google/devtools/build/skyframe/graph_inconsistency.proto
new file mode 100644
index 0000000..f391bdd
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/skyframe/graph_inconsistency.proto
@@ -0,0 +1,46 @@
+// Copyright 2020 The Bazel Authors. All rights reserved.
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+//    http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+syntax = "proto3";
+
+package skyframe;
+
+option java_package = "com.google.devtools.build.skyframe.proto";
+option java_outer_classname = "GraphInconsistency";
+
+enum Inconsistency {
+  // proto3#toString() omits fields with value 0. To make RESET_REQUESTED be
+  // printed, we add a dummy enum at position 0.
+  IMPOSSIBLE_NO_INCONSISTENCY_TO_MAKE_OTHER_VALUES_NONZERO = 0;
+  RESET_REQUESTED = 1;
+  DIRTY_PARENT_HAD_MISSING_CHILD = 2;
+  PARENT_FORCE_REBUILD_OF_CHILD = 3;
+  PARENT_FORCE_REBUILD_OF_MISSING_CHILD = 4;
+  BUILDING_PARENT_FOUND_UNDONE_CHILD = 5;
+  ALREADY_DECLARED_CHILD_MISSING = 6;
+}
+
+// Information about inconsistencies encountered during an invocation (typically
+// only in Google-internal implementations).
+message InconsistencyStats {
+  repeated InconsistencyStat self_stats = 1;
+  repeated InconsistencyStat child_stats = 2;
+  repeated InconsistencyStat unexpected_self_stats = 3;
+  repeated InconsistencyStat unexpected_child_stats = 4;
+
+  message InconsistencyStat {
+    Inconsistency inconsistency = 1;
+    int64 count = 2;
+  }
+}
diff --git a/src/test/java/com/google/devtools/build/skyframe/BUILD b/src/test/java/com/google/devtools/build/skyframe/BUILD
index d2b78400..453afb4 100644
--- a/src/test/java/com/google/devtools/build/skyframe/BUILD
+++ b/src/test/java/com/google/devtools/build/skyframe/BUILD
@@ -59,6 +59,7 @@
         "//src/main/java/com/google/devtools/build/lib/collect/nestedset",
         "//src/main/java/com/google/devtools/build/lib/concurrent",
         "//src/main/java/com/google/devtools/build/skyframe",
+        "//src/main/java/com/google/devtools/build/skyframe:graph_inconsistency_java_proto",
         "//src/main/java/com/google/devtools/build/skyframe:skyframe-objects",
         "//src/test/java/com/google/devtools/build/lib:testutil",
         "//third_party:auto_value",
diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
index 5b3f4c4..5c5bdb3 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -46,7 +46,6 @@
 import com.google.devtools.build.lib.events.Reporter;
 import com.google.devtools.build.lib.testutil.TestThread;
 import com.google.devtools.build.lib.testutil.TestUtils;
-import com.google.devtools.build.skyframe.GraphInconsistencyReceiver.Inconsistency;
 import com.google.devtools.build.skyframe.GraphTester.NotComparableStringValue;
 import com.google.devtools.build.skyframe.GraphTester.StringValue;
 import com.google.devtools.build.skyframe.GraphTester.TestFunction;
@@ -57,6 +56,7 @@
 import com.google.devtools.build.skyframe.SkyFunction.Environment;
 import com.google.devtools.build.skyframe.SkyFunctionException.Transience;
 import com.google.devtools.build.skyframe.ThinNodeEntry.DirtyType;
+import com.google.devtools.build.skyframe.proto.GraphInconsistency.Inconsistency;
 import java.lang.ref.WeakReference;
 import java.util.ArrayList;
 import java.util.Collections;
@@ -2581,7 +2581,7 @@
               missingChild,
               otherKeys);
           Preconditions.checkState(
-              inconsistency == Inconsistency.CHILD_MISSING_FOR_DIRTY_NODE, inconsistency);
+              inconsistency == Inconsistency.DIRTY_PARENT_HAD_MISSING_CHILD, inconsistency);
           Preconditions.checkState(topKey.equals(key), key);
           numInconsistencyCalls.incrementAndGet();
         });