A bunch of unrelated cleanups: -Have SkylarkImportLookupFunction include causes in the SkyFunctionExceptions it throws. -Better transitive skyframe error declarations in ASTFileLookupFunction. -Have ErrorInfo differentiate between direct and transitive transience. -Introduce ErrorInfoManager and have ParallelEvaluator/ParallelEvaluatorContext use it. RELNOTES: None PiperOrigin-RevId: 159163186
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 418a4cf..bd90d8a 100644 --- a/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java +++ b/src/main/java/com/google/devtools/build/skyframe/ErrorInfo.java
@@ -42,6 +42,7 @@ Preconditions.checkNotNull(rootCauseException, "Cause null %s", rootCauseException), rootCauseSkyKey, /*cycles=*/ ImmutableList.<CycleInfo>of(), + skyFunctionException.isTransient(), isTransitivelyTransient || skyFunctionException.isTransient(), skyFunctionException.isCatastrophic()); } @@ -53,7 +54,8 @@ /*exception=*/ null, /*rootCauseOfException=*/ null, ImmutableList.of(cycleInfo), - /*isTransient=*/ false, + /*isDirectlyTransient=*/ false, + /*isTransitivelyTransient=*/ false, /*isCatastrophic=*/ false); } @@ -66,7 +68,7 @@ ImmutableList.Builder<CycleInfo> cycleBuilder = ImmutableList.builder(); Exception firstException = null; SkyKey firstChildKey = null; - boolean isTransient = false; + boolean isTransitivelyTransient = false; boolean isCatastrophic = false; for (ErrorInfo child : childErrors) { if (firstException == null) { @@ -76,7 +78,7 @@ } rootCausesBuilder.addTransitive(child.rootCauses); cycleBuilder.addAll(CycleInfo.prepareCycles(currentValue, child.cycles)); - isTransient |= child.isTransient(); + isTransitivelyTransient |= child.isTransitivelyTransient(); isCatastrophic |= child.isCatastrophic(); } @@ -85,7 +87,8 @@ firstException, firstChildKey, cycleBuilder.build(), - isTransient, + /*isDirectlyTransient=*/ false, + isTransitivelyTransient, isCatastrophic); } @@ -96,11 +99,17 @@ private final ImmutableList<CycleInfo> cycles; - private final boolean isTransient; + private final boolean isDirectlyTransient; + private final boolean isTransitivelyTransient; private final boolean isCatastrophic; - public ErrorInfo(NestedSet<SkyKey> rootCauses, @Nullable Exception exception, - SkyKey rootCauseOfException, ImmutableList<CycleInfo> cycles, boolean isTransient, + public ErrorInfo( + NestedSet<SkyKey> rootCauses, + @Nullable Exception exception, + SkyKey rootCauseOfException, + ImmutableList<CycleInfo> cycles, + boolean isDirectlyTransient, + boolean isTransitivelyTransient, boolean isCatostrophic) { Preconditions.checkState(exception != null || !Iterables.isEmpty(cycles), "At least one of exception and cycles must be non-null/empty, respectively"); @@ -112,7 +121,8 @@ this.exception = exception; this.rootCauseOfException = rootCauseOfException; this.cycles = cycles; - this.isTransient = isTransient; + this.isDirectlyTransient = isDirectlyTransient; + this.isTransitivelyTransient = isTransitivelyTransient; this.isCatastrophic = isCatostrophic; } @@ -162,11 +172,19 @@ } /** + * Returns true iff the error is directly transient, i.e. if there was a transient error + * encountered during the computation itself. + */ + public boolean isDirectlyTransient() { + return isDirectlyTransient; + } + + /** * Returns true iff the error is transitively transient, i.e. if retrying the same computation * could lead to a different result. */ - public boolean isTransient() { - return isTransient; + public boolean isTransitivelyTransient() { + return isTransitivelyTransient; } /**