From b2cca31705419ba1cd3744c23be4b1d9bdb5c467 Mon Sep 17 00:00:00 2001 From: Googler Date: Mon, 27 Nov 2023 17:03:10 -0800 Subject: [PATCH] Don't crash when loading a non-existent exec transition .bzl file. i.e. `$ bazel build //foo --experimental_exec_config=//bar/does_not_exist.bzl%my_transition` This is a small change but has lots of files because I had to move `BzlLoadFailedException` into its own class. So a lot of simple reference updates. Details: - `StarlarkExecTransitionLoader` is responsible for loading the exec transition. - It delegates to `BzlLoadFunction` to load the `bzl` file. - I need `StarlarkExecTransitionLoader` to anticipate `BzlLoadFailedException`. - I moved `BzlLoadFailedException` out of `BzlLoadFunction` to avoid a build dependency cycle: `BzlLoadFunction` is part of the catch-call `:skyframe_cluster` library, which itself depends on `StarlarkExecTransitionLoader`. - Kept a bunch of static `BzlLoadFailedException` instantiators in `BzlLoadFunction`. Many of these involve higher order types with the same dependency issues. - Updated the `BzlFileLoader` interface (which wraps `BzlLoadFunction` calls) to throw `BzlLoadFailedException`. - Updated `BzlFileLoader` implementations to check for that exception when Skyframe-evaluating. - Uncommented the test checking this functionality. PiperOrigin-RevId: 585800246 Change-Id: I71921380a658eb6c441b2600f0758049162f85c0 --- .../google/devtools/build/lib/analysis/BUILD | 1 + .../config/StarlarkExecTransitionLoader.java | 23 +++-- .../devtools/build/lib/bazel/bzlmod/BUILD | 1 + .../bzlmod/SingleExtensionEvalFunction.java | 2 +- .../build/lib/rules/starlarkdocextract/BUILD | 2 +- .../StarlarkDocExtract.java | 2 +- .../build/lib/skyframe/AspectFunction.java | 4 +- .../google/devtools/build/lib/skyframe/BUILD | 12 +++ .../BuildTopLevelAspectsDetailsFunction.java | 1 - .../lib/skyframe/BzlLoadFailedException.java | 72 +++++++++++++++ .../build/lib/skyframe/BzlLoadFunction.java | 89 ++++--------------- .../lib/skyframe/DependencyResolver.java | 2 +- .../build/lib/skyframe/PackageFunction.java | 1 - .../build/lib/skyframe/SkyframeBuildView.java | 6 +- .../skyframe/StarlarkBuiltinsFunction.java | 1 - .../devtools/build/lib/skyframe/config/BUILD | 1 + .../config/BaselineOptionsFunction.java | 4 +- .../ExecutionTransitionFactoryTest.java | 6 +- .../google/devtools/build/lib/skyframe/BUILD | 1 + .../lib/skyframe/BzlLoadFunctionTest.java | 1 - .../ConfigurationsForTargetsTest.java | 3 +- 21 files changed, 137 insertions(+), 98 deletions(-) create mode 100644 src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BUILD b/src/main/java/com/google/devtools/build/lib/analysis/BUILD index f44fdfe1c079ae..e28223e47c6616 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BUILD +++ b/src/main/java/com/google/devtools/build/lib/analysis/BUILD @@ -1845,6 +1845,7 @@ java_library( ":config/core_options", ":config/starlark_defined_config_transition", "//src/main/java/com/google/devtools/build/lib/cmdline", + "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", "//src/main/java/com/google/devtools/build/lib/skyframe:starlark_builtins_value", "//third_party:auto_value", diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java index 017a493b72d5eb..dc17be178c60db 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/StarlarkExecTransitionLoader.java @@ -18,6 +18,7 @@ import com.google.devtools.build.lib.analysis.starlark.StarlarkAttributeTransitionProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.cmdline.LabelSyntaxException; +import com.google.devtools.build.lib.skyframe.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.BzlLoadValue; import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsValue; import java.util.List; @@ -46,7 +47,7 @@ public interface BzlFileLoader { * Loads the given {@link BzlLoadValue.Key}. Returns null if not all Skyframe deps are ready. */ @Nullable - BzlLoadValue getValue(BzlLoadValue.Key key) throws InterruptedException; + BzlLoadValue getValue(BzlLoadValue.Key key) throws BzlLoadFailedException, InterruptedException; } /** @@ -75,14 +76,18 @@ public static Optional loadStarlarkExecTran } TransitionReference parsedRef = TransitionReference.create(userRef, "--experimental_exec_config"); - // TODO(b/301644122): catch and report BzlLoadFailedExceptions. This may required Bazel BUILD - // refactoring since BzlLoadFailedException is defined in BzlLoadFunction, which is part of - // the ":skyframe_cluster" target, which we can't depend on without dependency cycles. - BzlLoadValue bzlValue = - bzlFileLoader.getValue( - Objects.equals(parsedRef.bzlFile().getRepository(), StarlarkBuiltinsValue.BUILTINS_REPO) - ? BzlLoadValue.keyForBuiltins(parsedRef.bzlFile()) - : BzlLoadValue.keyForBuild(parsedRef.bzlFile())); + BzlLoadValue bzlValue; + try { + bzlValue = + bzlFileLoader.getValue( + Objects.equals( + parsedRef.bzlFile().getRepository(), StarlarkBuiltinsValue.BUILTINS_REPO) + ? BzlLoadValue.keyForBuiltins(parsedRef.bzlFile()) + : BzlLoadValue.keyForBuild(parsedRef.bzlFile())); + } catch (BzlLoadFailedException e) { + throw new StarlarkExecTransitionLoadingException( + "--experimental_exec_config", userRef, e.getMessage()); + } if (bzlValue == null) { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD index 62f23a6706da5e..a22f5fcbdc1b2a 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/BUILD @@ -218,6 +218,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/profiler", "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_directory_value", "//src/main/java/com/google/devtools/build/lib/rules:repository/repository_function", + "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_function", "//src/main/java/com/google/devtools/build/lib/skyframe:client_environment_value", diff --git a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java index 4cd81e7eeed0ec..533cf65a7b6136 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/bzlmod/SingleExtensionEvalFunction.java @@ -53,8 +53,8 @@ import com.google.devtools.build.lib.runtime.RepositoryRemoteExecutor; import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps; import com.google.devtools.build.lib.server.FailureDetails.ExternalDeps.Code; +import com.google.devtools.build.lib.skyframe.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.BzlLoadFunction; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.BzlLoadValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.lib.util.Fingerprint; diff --git a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD index 9723704e69f5cd..3ee975a0d594b2 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD +++ b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/BUILD @@ -28,9 +28,9 @@ java_library( "//src/main/java/com/google/devtools/build/lib/collect/nestedset", "//src/main/java/com/google/devtools/build/lib/packages", "//src/main/java/com/google/devtools/build/lib/profiler", + "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", "//src/main/java/com/google/devtools/build/lib/skyframe:repository_mapping_value", - "//src/main/java/com/google/devtools/build/lib/skyframe:skyframe_cluster", "//src/main/java/com/google/devtools/build/lib/util:filetype", "//src/main/java/com/google/devtools/build/skydoc/rendering:rendering_util", "//src/main/java/com/google/devtools/build/skydoc/rendering/proto:stardoc_output_java_proto", diff --git a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java index 9e61b7653f7fc6..00ee8deafdc489 100644 --- a/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java +++ b/src/main/java/com/google/devtools/build/lib/rules/starlarkdocextract/StarlarkDocExtract.java @@ -48,7 +48,7 @@ import com.google.devtools.build.lib.packages.ImplicitOutputsFunction.SafeImplicitOutputsFunction; import com.google.devtools.build.lib.profiler.Profiler; import com.google.devtools.build.lib.profiler.SilentCloseable; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; +import com.google.devtools.build.lib.skyframe.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.BzlLoadValue; import com.google.devtools.build.lib.skyframe.RepositoryMappingValue; import com.google.devtools.build.lib.skyframe.RepositoryMappingValue.RepositoryMappingResolutionException; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java index b72c3922c0d93e..931ba5154cff55 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/AspectFunction.java @@ -79,7 +79,6 @@ import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; import com.google.devtools.build.lib.profiler.memory.CurrentRuleTracker; import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.SkyframeExecutor.BuildViewProvider; import com.google.devtools.build.lib.skyframe.config.BuildConfigurationKey; import com.google.devtools.build.lib.skyframe.toolchains.ToolchainException; @@ -318,7 +317,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) targetAndConfiguration.getConfiguration() == null ? null : targetAndConfiguration.getConfiguration().getOptions(), - (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey)); + (bzlKey) -> + (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class)); if (starlarkExecTransition == null) { return null; // Need Skyframe deps. } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD index f874842989c293..228efd91d640c0 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BUILD @@ -102,6 +102,7 @@ java_library( ":build_result_listener", ":bzl_compile", ":bzl_load_cycle_reporter", + ":bzl_load_failed_exception", ":bzl_load_value", ":bzlmod_repo_cycle_reporter", ":cached_bzl_load_value_and_deps", @@ -2404,6 +2405,17 @@ java_library( ], ) +java_library( + name = "bzl_load_failed_exception", + srcs = ["BzlLoadFailedException.java"], + deps = [ + ":sane_analysis_exception", + "//src/main/java/com/google/devtools/build/lib/util:detailed_exit_code", + "//src/main/java/com/google/devtools/build/skyframe", + "//src/main/protobuf:failure_details_java_proto", + ], +) + java_library( name = "state_informing_sky_function_environment", srcs = ["StateInformingSkyFunctionEnvironment.java"], diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java index 130e16f8ea7110..3b2b765033c92f 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BuildTopLevelAspectsDetailsFunction.java @@ -34,7 +34,6 @@ import com.google.devtools.build.lib.server.FailureDetails.Analysis.Code; import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.DetailedExitCode; import com.google.devtools.build.skyframe.SkyFunction; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java new file mode 100644 index 00000000000000..ade93f4d1ba2f7 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFailedException.java @@ -0,0 +1,72 @@ +// Copyright 2023 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. +package com.google.devtools.build.lib.skyframe; + +import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; +import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading; +import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading.Code; +import com.google.devtools.build.lib.util.DetailedExitCode; +import com.google.devtools.build.skyframe.SkyFunctionException.Transience; + +/** Exceptions from {@link BzlLoadFunction}. */ +public final class BzlLoadFailedException extends Exception implements SaneAnalysisException { + private final Transience transience; + private final DetailedExitCode detailedExitCode; + + private BzlLoadFailedException( + String errorMessage, DetailedExitCode detailedExitCode, Transience transience) { + super(errorMessage); + this.transience = transience; + this.detailedExitCode = detailedExitCode; + } + + BzlLoadFailedException(String errorMessage, DetailedExitCode detailedExitCode) { + this(errorMessage, detailedExitCode, Transience.PERSISTENT); + } + + BzlLoadFailedException( + String errorMessage, + DetailedExitCode detailedExitCode, + Exception cause, + Transience transience) { + super(errorMessage, cause); + this.transience = transience; + this.detailedExitCode = detailedExitCode; + } + + BzlLoadFailedException(String errorMessage, Code code) { + this(errorMessage, createDetailedExitCode(errorMessage, code), Transience.PERSISTENT); + } + + BzlLoadFailedException(String errorMessage, Code code, Exception cause, Transience transience) { + this(errorMessage, createDetailedExitCode(errorMessage, code), cause, transience); + } + + Transience getTransience() { + return transience; + } + + @Override + public DetailedExitCode getDetailedExitCode() { + return detailedExitCode; + } + + static DetailedExitCode createDetailedExitCode(String message, Code code) { + return DetailedExitCode.of( + FailureDetail.newBuilder() + .setMessage(message) + .setStarlarkLoading(StarlarkLoading.newBuilder().setCode(code)) + .build()); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java index 1d4cc4ba8979b6..08a3ee4e2d80f7 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/BzlLoadFunction.java @@ -47,8 +47,6 @@ import com.google.devtools.build.lib.packages.SymbolGenerator; import com.google.devtools.build.lib.packages.WorkspaceFileValue; import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; -import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; -import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading; import com.google.devtools.build.lib.server.FailureDetails.StarlarkLoading.Code; import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException; import com.google.devtools.build.lib.util.DetailedExitCode; @@ -553,7 +551,7 @@ private BzlLoadValue computeInternal( try { compileValue = getter.getBzlCompileValue(compileKey, env); } catch (BzlCompileFunction.FailedIOException e) { - throw BzlLoadFailedException.errorReadingBzl(filePath, e); + throw errorReadingBzl(filePath, e); } if (compileValue == null) { return null; @@ -609,7 +607,7 @@ private StarlarkBuiltinsValue getBuiltins( /* bzlLoadFunction= */ this); } } catch (BuiltinsFailedException e) { - throw BzlLoadFailedException.builtinsFailed(key.getLabel(), e); + throw builtinsFailed(key.getLabel(), e); } } @@ -649,7 +647,7 @@ private BzlCompileValue.Key validatePackageAndGetCompileKey( // Bypass package lookup entirely if builtins. if (key.isBuiltins()) { if (!label.getPackageName().isEmpty()) { - throw BzlLoadFailedException.noBuildFile(label, "@_builtins cannot have subpackages"); + throw noBuildFile(label, "@_builtins cannot have subpackages"); } return key.getCompileKey(getBuiltinsRoot(builtinsBzlPath)); } @@ -666,7 +664,7 @@ private BzlCompileValue.Key validatePackageAndGetCompileKey( BuildFileNotFoundException.class, InconsistentFilesystemException.class); } catch (BuildFileNotFoundException | InconsistentFilesystemException e) { - throw BzlLoadFailedException.errorFindingContainingPackage(label.toPathFragment(), e); + throw errorFindingContainingPackage(label.toPathFragment(), e); } if (packageLookup == null) { return null; @@ -685,10 +683,9 @@ private BzlCompileValue.Key validatePackageAndGetCompileKey( compileKey = key.getCompileKey(packageLookup.getContainingPackageRoot()); } else { if (!packageLookup.hasContainingPackage()) { - throw BzlLoadFailedException.noBuildFile( - label, packageLookup.getReasonForNoContainingPackage()); + throw noBuildFile(label, packageLookup.getReasonForNoContainingPackage()); } else { - throw BzlLoadFailedException.labelCrossesPackageBoundary(label, packageLookup); + throw labelCrossesPackageBoundary(label, packageLookup); } } } @@ -1153,7 +1150,7 @@ private static List computeBzlLoadsWithSkyframe( try { bzlLoads.add((BzlLoadValue) values.getOrThrow(keys.get(i), BzlLoadFailedException.class)); } catch (BzlLoadFailedException ex) { - throw BzlLoadFailedException.whileLoadingDep(programLoads.get(i).second, ex); + throw whileLoadingDep(programLoads.get(i).second, ex); } } return env.valuesMissing() ? null : bzlLoads; @@ -1197,7 +1194,7 @@ private List computeBzlLoadsWithInlining( cachedData = computeInlineCachedData(keys.get(i), inliningState); } catch (BzlLoadFailedException e) { if (deferredException == null) { - deferredException = BzlLoadFailedException.whileLoadingDep(programLoads.get(i).second, e); + deferredException = whileLoadingDep(programLoads.get(i).second, e); } continue; } @@ -1273,7 +1270,7 @@ static void checkLoadVisibilities( } } if (foundViolation && !demoteErrorsToWarnings) { - throw BzlLoadFailedException.visibilityViolation(requestingFileDescription); + throw visibilityViolation(requestingFileDescription); } } @@ -1360,7 +1357,7 @@ private static void executeBzlFile( execAndExport(prog, label, starlarkEventHandler, module, thread); if (sawStarlarkError.get()) { - throw BzlLoadFailedException.executionFailed(label); + throw executionFailed(label); } } } @@ -1496,59 +1493,6 @@ private void reset() { } } - /** Indicates a failure to load a .bzl file. */ - public static final class BzlLoadFailedException extends Exception - implements SaneAnalysisException { - private final Transience transience; - private final DetailedExitCode detailedExitCode; - - private BzlLoadFailedException( - String errorMessage, DetailedExitCode detailedExitCode, Transience transience) { - super(errorMessage); - this.transience = transience; - this.detailedExitCode = detailedExitCode; - } - - private BzlLoadFailedException(String errorMessage, DetailedExitCode detailedExitCode) { - this(errorMessage, detailedExitCode, Transience.PERSISTENT); - } - - private BzlLoadFailedException( - String errorMessage, - DetailedExitCode detailedExitCode, - Exception cause, - Transience transience) { - super(errorMessage, cause); - this.transience = transience; - this.detailedExitCode = detailedExitCode; - } - - private BzlLoadFailedException(String errorMessage, Code code) { - this(errorMessage, createDetailedExitCode(errorMessage, code), Transience.PERSISTENT); - } - - private BzlLoadFailedException( - String errorMessage, Code code, Exception cause, Transience transience) { - this(errorMessage, createDetailedExitCode(errorMessage, code), cause, transience); - } - - Transience getTransience() { - return transience; - } - - @Override - public DetailedExitCode getDetailedExitCode() { - return detailedExitCode; - } - - private static DetailedExitCode createDetailedExitCode(String message, Code code) { - return DetailedExitCode.of( - FailureDetail.newBuilder() - .setMessage(message) - .setStarlarkLoading(StarlarkLoading.newBuilder().setCode(code)) - .build()); - } - private static BzlLoadFailedException whileLoadingDep( Location loc, BzlLoadFailedException cause) { // Don't chain exception cause, just incorporate the message with a prefix. @@ -1573,10 +1517,11 @@ static BzlLoadFailedException errorFindingContainingPackage( String errorMessage = String.format( "Encountered error while reading extension file '%s': %s", file, cause.getMessage()); - DetailedExitCode detailedExitCode = - cause instanceof DetailedException - ? ((DetailedException) cause).getDetailedExitCode() - : createDetailedExitCode(errorMessage, Code.CONTAINING_PACKAGE_NOT_FOUND); + DetailedExitCode detailedExitCode = + cause instanceof DetailedException + ? ((DetailedException) cause).getDetailedExitCode() + : BzlLoadFailedException.createDetailedExitCode( + errorMessage, Code.CONTAINING_PACKAGE_NOT_FOUND); return new BzlLoadFailedException( errorMessage, detailedExitCode, cause, Transience.PERSISTENT); } @@ -1639,11 +1584,11 @@ static BzlLoadFailedException visibilityViolation(String fileDescription) { String.format("%s contains .bzl load visibility violations", fileDescription), Code.VISIBILITY_ERROR); } - } + private static final class BzlLoadFunctionException extends SkyFunctionException { private BzlLoadFunctionException(BzlLoadFailedException cause) { - super(cause, cause.transience); + super(cause, cause.getTransience()); } } } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java b/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java index 311660ce0b4acd..a4c0da94349aec 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/DependencyResolver.java @@ -379,7 +379,7 @@ public boolean evaluate( targetAndConfiguration.getConfiguration() == null ? null : targetAndConfiguration.getConfiguration().getOptions(), - (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey)); + (bzlKey) -> (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class)); if (starlarkExecTransition == null) { return false; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java index 32b8065e559a69..3e22e47177bd41 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/PackageFunction.java @@ -61,7 +61,6 @@ import com.google.devtools.build.lib.server.FailureDetails.FailureDetail; import com.google.devtools.build.lib.server.FailureDetails.PackageLoading; import com.google.devtools.build.lib.server.FailureDetails.PackageLoading.Code; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.GlobValue.InvalidGlobPatternException; import com.google.devtools.build.lib.skyframe.RepoFileFunction.BadRepoFileException; import com.google.devtools.build.lib.skyframe.StarlarkBuiltinsFunction.BuiltinsFailedException; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java index b06477d105b936..4b36ac5120b063 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java @@ -1306,7 +1306,11 @@ ConfiguredTarget createConfiguredTarget( Optional starlarkExecTransition = StarlarkExecTransitionLoader.loadStarlarkExecTransition( configuration == null ? null : configuration.getOptions(), - (bzlKey) -> (BzlLoadValue) analysisEnvironment.getSkyframeEnv().getValue(bzlKey)); + (bzlKey) -> + (BzlLoadValue) + analysisEnvironment + .getSkyframeEnv() + .getValueOrThrow(bzlKey, BzlLoadFailedException.class)); if (starlarkExecTransition == null) { return null; } diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java index 2ffbc6cca615c9..149c68ea2da69a 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/StarlarkBuiltinsFunction.java @@ -19,7 +19,6 @@ import com.google.devtools.build.lib.packages.BazelStarlarkEnvironment; import com.google.devtools.build.lib.packages.BazelStarlarkEnvironment.InjectionException; import com.google.devtools.build.lib.packages.semantics.BuildLanguageOptions; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; import com.google.devtools.build.skyframe.RecordingSkyFunctionEnvironment; import com.google.devtools.build.skyframe.SkyFunction; import com.google.devtools.build.skyframe.SkyFunctionException; diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD index 9535224d0e2038..ffdf5b6f0f83d7 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD +++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/BUILD @@ -43,6 +43,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/packages", "//src/main/java/com/google/devtools/build/lib/packages/semantics", "//src/main/java/com/google/devtools/build/lib/pkgcache", + "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", "//src/main/java/com/google/devtools/build/lib/skyframe:package_value", "//src/main/java/com/google/devtools/build/lib/skyframe:precomputed_value", diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java b/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java index b1ec3230afdd97..42f546ab8794e6 100644 --- a/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java +++ b/src/main/java/com/google/devtools/build/lib/skyframe/config/BaselineOptionsFunction.java @@ -27,6 +27,7 @@ import com.google.devtools.build.lib.analysis.starlark.StarlarkAttributeTransitionProvider; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.packages.AttributeTransitionData; +import com.google.devtools.build.lib.skyframe.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.BzlLoadValue; import com.google.devtools.build.lib.skyframe.PrecomputedValue; import com.google.devtools.build.skyframe.SkyFunction; @@ -66,7 +67,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) try { starlarkExecTransition = StarlarkExecTransitionLoader.loadStarlarkExecTransition( - mappedBaselineOptions, (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey)); + mappedBaselineOptions, + (bzlKey) -> (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class)); } catch (StarlarkExecTransitionLoadingException e) { throw new BaselineOptionsFunctionException(e); } diff --git a/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java b/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java index 1fc6f2a8acdd2f..41f0144ecfbe81 100644 --- a/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java +++ b/src/test/java/com/google/devtools/build/lib/analysis/config/ExecutionTransitionFactoryTest.java @@ -196,10 +196,8 @@ public void executionTransition_confDist_off() throws Exception { + " //pkg:file.bzl%%symbol'}", "{cmdLineRef: '//test:defs.bzl%symbol_doesnt_exist', expectedError: 'symbol_doesnt_exist not" + " found in //test:defs.bzl'}", - // TODO(b/301644122): Enable when we can process BzlLoadFailedException. See similar TODO in - // StarlarkExecTransitionLoader.java for details. - // "{cmdLineRef: '//test:file_doesnt_exist.bzl%symbol', expectedError:" - // + " '''//test:file_doesnt_exist.bzl'': no such file'}", + "{cmdLineRef: '//test:file_doesnt_exist.bzl%symbol', expectedError:" + + " '''//test:file_doesnt_exist.bzl'': no such file'}", "{cmdLineRef: '//test:defs.bzl%not_a_transition', expectedError: 'not_a_transition is not a" + " Starlark transition.'}" }) diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD index 7ba87fe36d17c6..74af52e4ca2352 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/BUILD +++ b/src/test/java/com/google/devtools/build/lib/skyframe/BUILD @@ -204,6 +204,7 @@ java_test( "//src/main/java/com/google/devtools/build/lib/skyframe:broken_diff_awareness_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:builder", "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_compile", + "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_failed_exception", "//src/main/java/com/google/devtools/build/lib/skyframe:bzl_load_value", "//src/main/java/com/google/devtools/build/lib/skyframe:cached_bzl_load_value_and_deps", "//src/main/java/com/google/devtools/build/lib/skyframe:cached_bzl_load_value_and_deps_builder_factory", diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java index 6160a7856bc36e..1cc32eb28c5f44 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/BzlLoadFunctionTest.java @@ -30,7 +30,6 @@ import com.google.devtools.build.lib.pkgcache.PackageOptions; import com.google.devtools.build.lib.pkgcache.PathPackageLocator; import com.google.devtools.build.lib.runtime.QuiescingExecutorsImpl; -import com.google.devtools.build.lib.skyframe.BzlLoadFunction.BzlLoadFailedException; import com.google.devtools.build.lib.skyframe.util.SkyframeExecutorTestUtils; import com.google.devtools.build.lib.util.io.TimestampGranularityMonitor; import com.google.devtools.build.lib.vfs.DigestHashFunction; diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java index 8f68a1b51f9ca9..fc03b0f8d0bf95 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfigurationsForTargetsTest.java @@ -140,7 +140,8 @@ public SkyValue compute(SkyKey skyKey, Environment env) targetAndConfiguration.getTarget() == null ? null : targetAndConfiguration.getConfiguration().getOptions(), - (bzlKey) -> (BzlLoadValue) env.getValue(bzlKey)); + (bzlKey) -> + (BzlLoadValue) env.getValueOrThrow(bzlKey, BzlLoadFailedException.class)); if (starlarkExecTransition == null) { return null; }