Skip to content

Commit c2a6f0c

Browse files
joelebacopybara-github
authored andcommitted
Add CoverageActionsFinishedId to the build_event_stream proto.
With Skymeld, the coverage actions are run _after_ the analysis & execution phase, since this is the earliest place where we can 1) have the list of analyzed tests and 2) request for a Skyframe evaluation. Unfortunately, this means that the info about the coverage artifacts would be missing in the BEP message triggered by the `TargetCompleteEvents`, which are sent at the end of the analysis & execution phase. This CL fixes that by adding an empty `CoverageActionsFinishedId`, which is listed as a `#postedAfter()` event of `TargetCompleteEvent`. This ensures that all info regarding the coverage artifacts is availble by the time we convert the `TargetCompleteEvent` to a BEP message. PiperOrigin-RevId: 534809359 Change-Id: Iabde183433a8492d9f009e7b235990efe7fc7069
1 parent 23f9c10 commit c2a6f0c

9 files changed

Lines changed: 77 additions & 1 deletion

File tree

src/main/java/com/google/devtools/build/lib/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,7 @@ java_library(
336336
"//src/main/java/com/google/devtools/build/lib/analysis:provider_collection",
337337
"//src/main/java/com/google/devtools/build/lib/analysis:server_directories",
338338
"//src/main/java/com/google/devtools/build/lib/analysis:template_expansion_exception",
339+
"//src/main/java/com/google/devtools/build/lib/analysis:test/coverage_action_finished_event",
339340
"//src/main/java/com/google/devtools/build/lib/analysis:test/coverage_report_action_factory",
340341
"//src/main/java/com/google/devtools/build/lib/analysis:top_level_artifact_context",
341342
"//src/main/java/com/google/devtools/build/lib/analysis:transitive_info_collection",

src/main/java/com/google/devtools/build/lib/analysis/BUILD

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2627,6 +2627,16 @@ java_library(
26272627
],
26282628
)
26292629

2630+
java_library(
2631+
name = "test/coverage_action_finished_event",
2632+
srcs = ["test/CoverageActionFinishedEvent.java"],
2633+
deps = [
2634+
"//src/main/java/com/google/devtools/build/lib/buildeventstream",
2635+
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
2636+
"//third_party:guava",
2637+
],
2638+
)
2639+
26302640
java_library(
26312641
name = "test/execution_info",
26322642
srcs = ["test/ExecutionInfo.java"],

src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,6 @@ private TargetCompleteEvent(
151151
postedAfterBuilder.add(cause.getIdProto());
152152
}
153153
detailedExitCode = mostImportantDetailedExitCode;
154-
this.postedAfter = postedAfterBuilder.build();
155154
this.completionContext = completionContext;
156155
this.outputs = outputs;
157156
this.isTest = isTest;
@@ -174,10 +173,12 @@ private TargetCompleteEvent(
174173
instrumentedFilesProvider.getBaselineCoverageArtifacts();
175174
if (!baselineCoverageArtifacts.isEmpty()) {
176175
this.baselineCoverageArtifacts = baselineCoverageArtifacts;
176+
postedAfterBuilder.add(BuildEventIdUtil.coverageActionsFinished());
177177
} else {
178178
this.baselineCoverageArtifacts = null;
179179
}
180180
}
181+
this.postedAfter = postedAfterBuilder.build();
181182
this.tags = targetAndData.getRuleTags();
182183
}
183184

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
// Copyright 2023 The Bazel Authors. All rights reserved.
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.test;
16+
17+
import com.google.common.collect.ImmutableList;
18+
import com.google.devtools.build.lib.buildeventstream.BuildEvent;
19+
import com.google.devtools.build.lib.buildeventstream.BuildEventContext;
20+
import com.google.devtools.build.lib.buildeventstream.BuildEventIdUtil;
21+
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
22+
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId;
23+
import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
24+
import java.util.Collection;
25+
26+
/**
27+
* Signal that the coverage actions are finished. Only used as a prerequisite for {@link
28+
* com.google.devtools.build.lib.analysis.TargetCompleteEvent} in Skymeld mode.
29+
*/
30+
public class CoverageActionFinishedEvent implements BuildEvent {
31+
32+
@Override
33+
public BuildEventStreamProtos.BuildEvent asStreamProto(BuildEventContext context)
34+
throws InterruptedException {
35+
return GenericBuildEvent.protoChaining(this).build();
36+
}
37+
38+
@Override
39+
public BuildEventId getEventId() {
40+
return BuildEventIdUtil.coverageActionsFinished();
41+
}
42+
43+
@Override
44+
public Collection<BuildEventId> getChildrenEvents() {
45+
return ImmutableList.of();
46+
}
47+
}

src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventIdUtil.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,12 @@ public static BuildEventId targetConfigured(Label label) {
130130
return BuildEventId.newBuilder().setTargetConfigured(configuredId).build();
131131
}
132132

133+
public static BuildEventId coverageActionsFinished() {
134+
return BuildEventId.newBuilder()
135+
.setCoverageActionsFinished(BuildEventId.CoverageActionsFinishedId.getDefaultInstance())
136+
.build();
137+
}
138+
133139
public static BuildEventId aspectConfigured(Label label, String aspect) {
134140
BuildEventId.TargetConfiguredId configuredId =
135141
BuildEventId.TargetConfiguredId.newBuilder()

src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ message BuildEventId {
223223
// Identifier of an event providing convenience symlinks information.
224224
message ConvenienceSymlinksIdentifiedId {}
225225

226+
// Identifier of an event signalling that the coverage actions are finished.
227+
message CoverageActionsFinishedId {}
228+
226229
oneof id {
227230
UnknownBuildEventId unknown = 1;
228231
ProgressId progress = 2;
@@ -250,6 +253,7 @@ message BuildEventId {
250253
WorkspaceConfigId workspace = 23;
251254
BuildMetadataId build_metadata = 24;
252255
ConvenienceSymlinksIdentifiedId convenience_symlinks_identified = 25;
256+
CoverageActionsFinishedId coverage_actions_finished = 27;
253257
}
254258
}
255259

src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
import com.google.devtools.build.lib.actions.TestExecException;
3131
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
3232
import com.google.devtools.build.lib.analysis.TopLevelArtifactContext;
33+
import com.google.devtools.build.lib.analysis.test.CoverageActionFinishedEvent;
3334
import com.google.devtools.build.lib.analysis.test.TestProvider;
3435
import com.google.devtools.build.lib.bugreport.BugReporter;
3536
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent;
@@ -119,6 +120,9 @@ public void buildArtifacts(
119120
skyframeExecutor
120121
.getEventBus()
121122
.post(new ExecutionProgressReceiverAvailableEvent(executionProgressReceiver));
123+
// When not in Skymeld mode, TargetCompleteEvents don't need to be held back.
124+
// See {@link CoverageActionFinishedEvent}.
125+
skyframeExecutor.getEventBus().post(new CoverageActionFinishedEvent());
122126

123127
List<DetailedExitCode> detailedExitCodes = new ArrayList<>();
124128
EvaluationResult<?> result;

src/main/java/com/google/devtools/build/lib/skyframe/BUILD

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,7 @@ java_library(
265265
"//src/main/java/com/google/devtools/build/lib/analysis:target_and_configuration",
266266
"//src/main/java/com/google/devtools/build/lib/analysis:template_expansion_exception",
267267
"//src/main/java/com/google/devtools/build/lib/analysis:test/analysis_failure_propagation_exception",
268+
"//src/main/java/com/google/devtools/build/lib/analysis:test/coverage_action_finished_event",
268269
"//src/main/java/com/google/devtools/build/lib/analysis:toolchain_collection",
269270
"//src/main/java/com/google/devtools/build/lib/analysis:toolchain_context",
270271
"//src/main/java/com/google/devtools/build/lib/analysis:top_level_artifact_context",

src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@
6666
import com.google.devtools.build.lib.analysis.config.ConfigConditions;
6767
import com.google.devtools.build.lib.analysis.config.StarlarkTransitionCache;
6868
import com.google.devtools.build.lib.analysis.test.AnalysisFailurePropagationException;
69+
import com.google.devtools.build.lib.analysis.test.CoverageActionFinishedEvent;
6970
import com.google.devtools.build.lib.bugreport.BugReport;
7071
import com.google.devtools.build.lib.bugreport.BugReporter;
7172
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics.BuildGraphMetrics;
@@ -660,6 +661,7 @@ public SkyframeAnalysisResult analyzeAndExecuteTargets(
660661
buildResultListener.getAnalyzedTargets(),
661662
buildResultListener.getAnalyzedTests())),
662663
keepGoing);
664+
eventBus.post(new CoverageActionFinishedEvent());
663665
if (additionalArtifactsResult.hasError()) {
664666
detailedExitCodes.add(
665667
SkyframeErrorProcessor.processErrors(

0 commit comments

Comments
 (0)