Repurpose the not-meaningfully-used ErrorInfo#isTransient to mean "is transitively transient". Some followup changes will use this method.

Previously, ErrorInfo#isTransient was only used internally in ParallelEvaluator; I think this method was originally added to ErrorInfo solely for the sake of convenience.

--
MOS_MIGRATED_REVID=109840031
diff --git a/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java b/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java
index 2a5db2d..3e15000 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ErrorInfoTest.java
@@ -47,25 +47,45 @@
     }
   }
 
-  @Test
-  public void testFromException() {
+  private void runTestFromException(boolean isDirectlyTransient, boolean isTransitivelyTransient) {
     Exception exception = new IOException("ehhhhh");
     SkyKey causeOfException = new SkyKey(SkyFunctionName.create("CAUSE"), 1234);
     DummySkyFunctionException dummyException =
-        new DummySkyFunctionException(exception, /*isTransient=*/ true, /*isCatastrophic=*/ false);
+        new DummySkyFunctionException(exception, isDirectlyTransient, /*isCatastrophic=*/ false);
 
     ErrorInfo errorInfo = ErrorInfo.fromException(
-        new ReifiedSkyFunctionException(dummyException, causeOfException));
+        new ReifiedSkyFunctionException(dummyException, causeOfException),
+        isTransitivelyTransient);
 
     assertThat(errorInfo.getRootCauses()).containsExactly(causeOfException);
     assertThat(errorInfo.getException()).isSameAs(exception);
     assertThat(errorInfo.getRootCauseOfException()).isSameAs(causeOfException);
     assertThat(errorInfo.getCycleInfo()).isEmpty();
-    assertThat(errorInfo.isTransient()).isTrue();
+    assertThat(errorInfo.isTransient()).isEqualTo(isDirectlyTransient || isTransitivelyTransient);
     assertThat(errorInfo.isCatastrophic()).isFalse();
   }
 
   @Test
+  public void testFromException_NonTransient() {
+    runTestFromException(/*isDirectlyTransient=*/ false, /*isTransitivelyTransient= */ false);
+  }
+
+  @Test
+  public void testFromException_DirectlyTransient() {
+    runTestFromException(/*isDirectlyTransient=*/ true, /*isTransitivelyTransient= */ false);
+  }
+
+  @Test
+  public void testFromException_TransitivelyTransient() {
+    runTestFromException(/*isDirectlyTransient=*/ false, /*isTransitivelyTransient= */ true);
+  }
+
+  @Test
+  public void testFromException_DirectlyAndTransitivelyTransient() {
+    runTestFromException(/*isDirectlyTransient=*/ true, /*isTransitivelyTransient= */ true);
+  }
+
+  @Test
   public void testFromCycle() {
     CycleInfo cycle = new CycleInfo(
         ImmutableList.of(new SkyKey(SkyFunctionName.create("PATH"), 1234)),
@@ -92,15 +112,17 @@
     DummySkyFunctionException dummyException1 =
         new DummySkyFunctionException(exception1, /*isTransient=*/ true, /*isCatastrophic=*/ false);
     ErrorInfo exceptionErrorInfo1 = ErrorInfo.fromException(
-        new ReifiedSkyFunctionException(dummyException1, causeOfException1));
+        new ReifiedSkyFunctionException(dummyException1, causeOfException1),
+        /*isTransitivelyTransient=*/ false);
 
     // N.B this ErrorInfo will be catastrophic.
     Exception exception2 = new IOException("blahhhhh");
     SkyKey causeOfException2 = new SkyKey(SkyFunctionName.create("CAUSE2"), 5678);
     DummySkyFunctionException dummyException2 =
-        new DummySkyFunctionException(exception2, /*isTransient=*/ true, /*isCatastrophic=*/ true);
+        new DummySkyFunctionException(exception2, /*isTransient=*/ false, /*isCatastrophic=*/ true);
     ErrorInfo exceptionErrorInfo2 = ErrorInfo.fromException(
-        new ReifiedSkyFunctionException(dummyException2, causeOfException2));
+        new ReifiedSkyFunctionException(dummyException2, causeOfException2),
+        /*isTransitivelyTransient=*/ false);
 
     SkyKey currentKey = new SkyKey(SkyFunctionName.create("CURRENT"), 9876);
 
@@ -119,7 +141,7 @@
         new CycleInfo(
             ImmutableList.of(currentKey, Iterables.getOnlyElement(cycle.getPathToCycle())),
             cycle.getCycle()));
-    assertThat(errorInfo.isTransient()).isFalse();
+    assertThat(errorInfo.isTransient()).isTrue();
     assertThat(errorInfo.isCatastrophic()).isTrue();
   }