aboutsummaryrefslogtreecommitdiffhomepage
path: root/src
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2016-11-23 12:38:24 +0000
committerGravatar Dmitry Lomov <dslomov@google.com>2016-11-23 13:56:26 +0000
commit74d716bf1b00badbe7f1f028d8f005b1780b06bc (patch)
tree281823450c64d35a9912e8a88967b729fdf335f7 /src
parent7e5396a66cd7021150f9fab9ec8160c92fde618d (diff)
Declare order constraint in BEP
In the build event protocol, provide order guarantee to facilitate use: All the root causes referenced by a TargetCompleteEvent need to come before that event. Note that, by causality, the root causes have to be already knows, hence the root cause event is either generated already or about to be generated. -- Change-Id: I2bbe9b1a832c23217104a41e21d2f6ff13211c9a Reviewed-on: https://cr.bazel.build/7371 MOS_MIGRATED_REVID=140018440
Diffstat (limited to 'src')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java16
-rwxr-xr-xsrc/test/shell/integration/build_event_stream_test.sh20
2 files changed, 34 insertions, 2 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
index 453127c9f7..e2ebbb8624 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
@@ -16,9 +16,9 @@ package com.google.devtools.build.lib.analysis;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables;
-import com.google.devtools.build.lib.buildeventstream.BuildEvent;
import com.google.devtools.build.lib.buildeventstream.BuildEventId;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.buildeventstream.BuildEventWithOrderConstraint;
import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
import com.google.devtools.build.lib.causes.Cause;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
@@ -30,15 +30,22 @@ import com.google.devtools.build.skyframe.SkyValue;
import java.util.Collection;
/** This event is fired as soon as a target is either built or fails. */
-public final class TargetCompleteEvent implements SkyValue, BuildEvent {
+public final class TargetCompleteEvent implements SkyValue, BuildEventWithOrderConstraint {
private final ConfiguredTarget target;
private final NestedSet<Cause> rootCauses;
+ private final Collection<BuildEventId> postedAfter;
private TargetCompleteEvent(ConfiguredTarget target, NestedSet<Cause> rootCauses) {
this.target = target;
this.rootCauses =
(rootCauses == null) ? NestedSetBuilder.<Cause>emptySet(Order.STABLE_ORDER) : rootCauses;
+
+ ImmutableList.Builder postedAfterBuilder = ImmutableList.builder();
+ for (Cause cause : getRootCauses()) {
+ postedAfterBuilder.add(BuildEventId.fromCause(cause));
+ }
+ this.postedAfter = postedAfterBuilder.build();
}
/**
@@ -98,4 +105,9 @@ public final class TargetCompleteEvent implements SkyValue, BuildEvent {
BuildEventStreamProtos.TargetComplete.newBuilder().setSuccess(!failed()).build();
return GenericBuildEvent.protoChaining(this).setCompleted(complete).build();
}
+
+ @Override
+ public Collection<BuildEventId> postedAfter() {
+ return postedAfter;
+ }
}
diff --git a/src/test/shell/integration/build_event_stream_test.sh b/src/test/shell/integration/build_event_stream_test.sh
index 7a420c7604..9d16b69f3e 100755
--- a/src/test/shell/integration/build_event_stream_test.sh
+++ b/src/test/shell/integration/build_event_stream_test.sh
@@ -41,6 +41,11 @@ test_suite(
name = "suite",
tests = ["true"],
)
+genrule(
+ name = "fails_to_build",
+ outs = ["fails_to_build.txt"],
+ cmd = "false",
+)
EOF
}
@@ -87,4 +92,19 @@ function test_multiple_transports() {
[ -f ${outdir}/test_multiple_transports.bin ] || fail "Missing expected file test_multiple_transports.bin"
}
+function test_root_cause_early() {
+ (bazel build --experimental_build_event_text_file=$TEST_log \
+ pkg:fails_to_build && fail "bazel test failed") || true
+ # We expect precisely one action being reported (the failed one) and
+ # precisely on report on a completed target; moreover, the action has
+ # to be reported first.
+ expect_log_once '^action'
+ expect_log_once '^completed'
+ expect_not_log 'success'
+ local naction=`grep -n '^action' $TEST_log | cut -f 1 -d :`
+ local ncomplete=`grep -n '^completed' $TEST_log | cut -f 1 -d :`
+ [ $naction -lt $ncomplete ] \
+ || fail "failed action not before compelted target"
+}
+
run_suite "Integration tests for the build event stream"