Mark root causes as transient. Serializing nested sets is annoying, and since ErrorInfo doesn't override equality, there's no issue with preserving equality for now.
--
MOS_MIGRATED_REVID=103414237
diff --git a/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java b/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
index 09925a3..205afea 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
@@ -20,6 +20,7 @@
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.skyframe.SkyFunctionException.ReifiedSkyFunctionException;
+import java.io.IOException;
import java.io.Serializable;
import java.util.Collection;
@@ -31,10 +32,9 @@
* <p>This is intended only for use in alternative {@code MemoizingEvaluator} implementations.
*/
public class ErrorInfo implements Serializable {
- /**
- * The set of descendants of this value that failed to build
- */
- private final NestedSet<SkyKey> rootCauses;
+ /** The set of descendants of this value that failed to build. */
+ // Non-final only to allow for serialization.
+ private transient NestedSet<SkyKey> rootCauses;
/**
* An exception thrown upon a value's failure to build. The exception is used for reporting, and
@@ -154,4 +154,9 @@
public boolean isCatastrophic() {
return isCatastrophic;
}
+
+ private void readObject(java.io.ObjectInputStream in) throws IOException, ClassNotFoundException {
+ in.defaultReadObject();
+ rootCauses = NestedSetBuilder.emptySet(Order.STABLE_ORDER);
+ }
}
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 352bbb1..ffb5bf8 100644
--- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java
@@ -130,6 +130,10 @@
return true;
}
+ protected boolean rootCausesStored() {
+ return true;
+ }
+
@Before
public void initializeReporter() {
eventCollector = new EventCollector(EventKind.ALL_EVENTS);
@@ -369,7 +373,9 @@
initializeReporter();
EvaluationResult<StringValue> result = tester.eval(i == 0, "top");
assertTrue(result.hasError());
- assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
+ if (i == 0 || rootCausesStored()) {
+ assertThat(result.getError(topKey).getRootCauses()).containsExactly(topKey);
+ }
assertEquals(topKey.toString(), result.getError(topKey).getException().getMessage());
assertTrue(result.getError(topKey).getException() instanceof SomeErrorException);
if (i == 0 || eventsStored()) {