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();
});