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()) {