ulfjack | 6192b8c | 2018-05-24 02:40:42 -0700 | [diff] [blame] | 1 | // Copyright 2018 The Bazel Authors. All rights reserved. |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 2 | // |
| 3 | // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 | // you may not use this file except in compliance with the License. |
| 5 | // You may obtain a copy of the License at |
| 6 | // |
| 7 | // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 | // |
| 9 | // Unless required by applicable law or agreed to in writing, software |
| 10 | // distributed under the License is distributed on an "AS IS" BASIS, |
| 11 | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 12 | // See the License for the specific language governing permissions and |
| 13 | // limitations under the License. |
| 14 | |
| 15 | package com.google.devtools.build.lib.analysis; |
| 16 | |
ulfjack | 0629519 | 2019-01-16 09:13:34 -0800 | [diff] [blame] | 17 | import com.google.common.annotations.VisibleForTesting; |
adgar | 412e03c | 2020-05-07 08:20:55 -0700 | [diff] [blame] | 18 | import com.google.common.base.MoreObjects; |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 19 | import com.google.common.base.Preconditions; |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 20 | import com.google.common.collect.ImmutableList; |
ulfjack | 6192b8c | 2018-05-24 02:40:42 -0700 | [diff] [blame] | 21 | import com.google.common.collect.Iterables; |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 22 | import com.google.devtools.build.lib.actions.ActionLookupKey; |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 23 | import com.google.devtools.build.lib.buildeventstream.BuildEvent; |
ulfjack | 26e586d | 2018-05-17 08:42:13 -0700 | [diff] [blame] | 24 | import com.google.devtools.build.lib.buildeventstream.BuildEventContext; |
janakr | 3ca2468 | 2020-04-01 09:12:03 -0700 | [diff] [blame] | 25 | import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil; |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 26 | import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; |
janakr | 3ca2468 | 2020-04-01 09:12:03 -0700 | [diff] [blame] | 27 | import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId; |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 28 | import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent; |
| 29 | import com.google.devtools.build.lib.buildeventstream.NullConfiguration; |
ulfjack | 6192b8c | 2018-05-24 02:40:42 -0700 | [diff] [blame] | 30 | import com.google.devtools.build.lib.causes.Cause; |
ulfjack | 904a8d6 | 2018-05-29 05:17:35 -0700 | [diff] [blame] | 31 | import com.google.devtools.build.lib.cmdline.Label; |
ulfjack | 527cef4 | 2020-01-13 01:29:21 -0800 | [diff] [blame] | 32 | import com.google.devtools.build.lib.collect.nestedset.NestedSet; |
leba | b52a190 | 2021-09-23 01:35:13 -0700 | [diff] [blame] | 33 | import com.google.devtools.build.lib.skyframe.AspectKeyCreator.AspectKey; |
janakr | ac2cd35 | 2017-12-20 13:37:13 -0800 | [diff] [blame] | 34 | import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey; |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 35 | import java.util.Collection; |
ulfjack | 904a8d6 | 2018-05-29 05:17:35 -0700 | [diff] [blame] | 36 | import javax.annotation.Nullable; |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 37 | |
| 38 | /** |
ulfjack | 5e2133a | 2019-09-09 08:31:41 -0700 | [diff] [blame] | 39 | * This event is fired during the build, when it becomes known that the analysis of a top-level |
| 40 | * target cannot be completed because of an error in one of its dependencies. |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 41 | */ |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 42 | public class AnalysisFailureEvent implements BuildEvent { |
messa | c4157da | 2021-08-06 11:17:19 -0700 | [diff] [blame] | 43 | @Nullable private final AspectKey failedAspect; |
janakr | ac2cd35 | 2017-12-20 13:37:13 -0800 | [diff] [blame] | 44 | private final ConfiguredTargetKey failedTarget; |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 45 | private final BuildEventId configuration; |
ulfjack | 527cef4 | 2020-01-13 01:29:21 -0800 | [diff] [blame] | 46 | private final NestedSet<Cause> rootCauses; |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 47 | |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 48 | public AnalysisFailureEvent( |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 49 | ActionLookupKey failedTarget, BuildEventId configuration, NestedSet<Cause> rootCauses) { |
| 50 | Preconditions.checkArgument( |
messa | c4157da | 2021-08-06 11:17:19 -0700 | [diff] [blame] | 51 | failedTarget instanceof ConfiguredTargetKey || failedTarget instanceof AspectKey); |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 52 | if (failedTarget instanceof ConfiguredTargetKey) { |
| 53 | this.failedAspect = null; |
| 54 | this.failedTarget = (ConfiguredTargetKey) failedTarget; |
| 55 | } else { |
messa | c4157da | 2021-08-06 11:17:19 -0700 | [diff] [blame] | 56 | this.failedAspect = (AspectKey) failedTarget; |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 57 | this.failedTarget = failedAspect.getBaseConfiguredTargetKey(); |
| 58 | } |
| 59 | if (configuration != null) { |
| 60 | this.configuration = configuration; |
| 61 | } else { |
| 62 | this.configuration = NullConfiguration.INSTANCE.getEventId(); |
| 63 | } |
| 64 | this.rootCauses = rootCauses; |
| 65 | } |
| 66 | |
adgar | 412e03c | 2020-05-07 08:20:55 -0700 | [diff] [blame] | 67 | @Override |
| 68 | public String toString() { |
| 69 | return MoreObjects.toStringHelper(this) |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 70 | .add("failedAspect", failedAspect) |
adgar | 412e03c | 2020-05-07 08:20:55 -0700 | [diff] [blame] | 71 | .add("failedTarget", failedTarget) |
| 72 | .add("configuration", configuration) |
| 73 | .add("legacyFailureReason", getLegacyFailureReason()) |
| 74 | .toString(); |
| 75 | } |
| 76 | |
janakr | ac2cd35 | 2017-12-20 13:37:13 -0800 | [diff] [blame] | 77 | public ConfiguredTargetKey getFailedTarget() { |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 78 | return failedTarget; |
| 79 | } |
| 80 | |
ulfjack | 0629519 | 2019-01-16 09:13:34 -0800 | [diff] [blame] | 81 | @VisibleForTesting |
| 82 | BuildEventId getConfigurationId() { |
| 83 | return configuration; |
| 84 | } |
| 85 | |
ulfjack | 904a8d6 | 2018-05-29 05:17:35 -0700 | [diff] [blame] | 86 | /** |
| 87 | * Returns the label of a single root cause. Use {@link #getRootCauses} to report all root causes. |
| 88 | */ |
| 89 | @Nullable public Label getLegacyFailureReason() { |
ulfjack | 527cef4 | 2020-01-13 01:29:21 -0800 | [diff] [blame] | 90 | if (rootCauses.isEmpty()) { |
ulfjack | 904a8d6 | 2018-05-29 05:17:35 -0700 | [diff] [blame] | 91 | return null; |
| 92 | } |
ulfjack | 527cef4 | 2020-01-13 01:29:21 -0800 | [diff] [blame] | 93 | return rootCauses.toList().get(0).getLabel(); |
ulfjack | 904a8d6 | 2018-05-29 05:17:35 -0700 | [diff] [blame] | 94 | } |
| 95 | |
ulfjack | 527cef4 | 2020-01-13 01:29:21 -0800 | [diff] [blame] | 96 | public NestedSet<Cause> getRootCauses() { |
ulfjack | 904a8d6 | 2018-05-29 05:17:35 -0700 | [diff] [blame] | 97 | return rootCauses; |
| 98 | } |
| 99 | |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 100 | @Override |
| 101 | public BuildEventId getEventId() { |
adgar | 2487920 | 2021-04-12 09:21:20 -0700 | [diff] [blame] | 102 | if (failedAspect == null) { |
| 103 | return BuildEventIdUtil.targetCompleted(failedTarget.getLabel(), configuration); |
| 104 | } else { |
| 105 | return BuildEventIdUtil.aspectCompleted( |
| 106 | failedTarget.getLabel(), configuration, failedAspect.getAspectName()); |
| 107 | } |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 108 | } |
| 109 | |
| 110 | @Override |
| 111 | public Collection<BuildEventId> getChildrenEvents() { |
janakr | 3ca2468 | 2020-04-01 09:12:03 -0700 | [diff] [blame] | 112 | return ImmutableList.copyOf( |
| 113 | Iterables.transform(rootCauses.toList(), cause -> cause.getIdProto())); |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 114 | } |
| 115 | |
| 116 | @Override |
ulfjack | 26e586d | 2018-05-17 08:42:13 -0700 | [diff] [blame] | 117 | public BuildEventStreamProtos.BuildEvent asStreamProto(BuildEventContext converters) { |
Klaus Aehlig | fbdeffe | 2018-01-26 02:19:58 -0800 | [diff] [blame] | 118 | return GenericBuildEvent.protoChaining(this) |
| 119 | .setAborted( |
| 120 | BuildEventStreamProtos.Aborted.newBuilder() |
| 121 | .setReason(BuildEventStreamProtos.Aborted.AbortReason.ANALYSIS_FAILURE) |
| 122 | .build()) |
| 123 | .build(); |
| 124 | } |
Han-Wen Nienhuys | d08b27f | 2015-02-25 16:45:20 +0100 | [diff] [blame] | 125 | } |