diff options
Diffstat (limited to 'src/main/java/com/google')
5 files changed, 96 insertions, 29 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java index 360dfdb15c..467d6f2b20 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java @@ -130,4 +130,11 @@ public final class BuildEventId implements Serializable { return new BuildEventId( BuildEventStreamProtos.BuildEventId.newBuilder().setTestSummary(summaryId).build()); } + + public static BuildEventId buildFinished() { + BuildEventStreamProtos.BuildEventId.BuildFinishedId finishedId = + BuildEventStreamProtos.BuildEventId.BuildFinishedId.getDefaultInstance(); + return new BuildEventId( + BuildEventStreamProtos.BuildEventId.newBuilder().setBuildFinished(finishedId).build()); + } } diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto index f70c715781..1ff9d6a021 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto @@ -85,6 +85,10 @@ message BuildEventId { string label = 1; } + // Identifier of the BuildFinished event, indicating the end of a build. + message BuildFinishedId { + } + oneof id { UnknownBuildEventId unknown = 1; ProgressId progress = 2; @@ -94,6 +98,7 @@ message BuildEventId { ActionCompletedId action_completed = 6; TestResultId test_result = 8; TestSummaryId test_summary = 7; + BuildFinishedId build_finished = 9; } } @@ -139,6 +144,8 @@ message BuildStarted { string uuid = 1; // Start of the build in ms since the epoche. + // TODO(buchgr): Use google.protobuf.TimeStamp once bazel's protoc supports + // it. int64 start_time_millis = 2; // Version of the build tool that is running. @@ -245,6 +252,16 @@ message TestSummary { repeated File failed = 4; } +// Event indicating the end of a build. +message BuildFinished { + // If the build succeeded or failed. + bool overall_success = 1; + // Time in milliseconds since the epoch. + // TODO(buchgr): Use google.protobuf.Timestamp once bazel's protoc supports + // it. + int64 finish_time_millis = 2; +} + // Message describing a build event. Events will have an identifier that // is unique within a given build invocation; they also announce follow-up // events as children. More details, which are specific to the kind of event @@ -262,5 +279,6 @@ message BuildEvent { TargetComplete completed = 8; TestResult test_result = 10; TestSummary test_summary = 9; + BuildFinished finished = 14; }; } diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildCompleteEvent.java index 93416ba7ea..2412221513 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildCompleteEvent.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildCompleteEvent.java @@ -14,19 +14,31 @@ package com.google.devtools.build.lib.buildtool.buildevent; +import static com.google.devtools.build.lib.util.Preconditions.checkNotNull; + +import com.google.common.collect.ImmutableList; +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.BuildEventStreamProtos.BuildFinished; +import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent; +import com.google.devtools.build.lib.buildeventstream.PathConverter; import com.google.devtools.build.lib.buildtool.BuildResult; +import java.util.Collection; /** * This event is fired from BuildTool#stopRequest(). + * + * <p>This class also implements the {@link BuildFinished} event of the build event protocol (BEP). */ -public final class BuildCompleteEvent { +public final class BuildCompleteEvent implements BuildEvent { private final BuildResult result; /** * Construct the BuildCompleteEvent. */ public BuildCompleteEvent(BuildResult result) { - this.result = result; + this.result = checkNotNull(result); } /** @@ -35,4 +47,24 @@ public final class BuildCompleteEvent { public BuildResult getResult() { return result; } + + @Override + public BuildEventId getEventId() { + return BuildEventId.buildFinished(); + } + + @Override + public Collection<BuildEventId> getChildrenEvents() { + return ImmutableList.of(); + } + + @Override + public BuildEventStreamProtos.BuildEvent asStreamProto(PathConverter pathConverter) { + BuildFinished finished = + BuildFinished.newBuilder() + .setOverallSuccess(result.getSuccess()) + .setFinishTimeMillis(result.getStopTime()) + .build(); + return GenericBuildEvent.protoChaining(this).setFinished(finished).build(); + } } diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java index 3eff203b8d..71f7b0ca07 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/buildevent/BuildStartingEvent.java @@ -82,7 +82,8 @@ public final class BuildStartingEvent implements BuildEvent { public Collection<BuildEventId> getChildrenEvents() { return ImmutableList.of( ProgressEvent.INITIAL_PROGRESS_UPDATE, - BuildEventId.targetPatternExpanded(request.getTargets())); + BuildEventId.targetPatternExpanded(request.getTargets()), + BuildEventId.buildFinished()); } @Override diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java b/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java index 8f5292f83b..c0c50958b5 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java @@ -47,7 +47,7 @@ public class BuildEventStreamer implements EventHandler { private final Multimap<BuildEventId, BuildEvent> pendingEvents; private int progressCount; private AbortReason abortReason = AbortReason.UNKNOWN; - private static final Logger LOG = Logger.getLogger(BuildEventStreamer.class.getName()); + private static final Logger log = Logger.getLogger(BuildEventStreamer.class.getName()); public BuildEventStreamer(Collection<BuildEventTransport> transports) { this.transports = transports; @@ -98,7 +98,7 @@ public class BuildEventStreamer implements EventHandler { transport.sendBuildEvent(event); } catch (IOException e) { // TODO(aehlig): signal that the build ought to be aborted - LOG.severe("Failed to write to build event transport: " + e); + log.severe("Failed to write to build event transport: " + e); } } } @@ -135,7 +135,7 @@ public class BuildEventStreamer implements EventHandler { transport.close(); } catch (IOException e) { // TODO(aehlig): signal that the build ought to be aborted - LOG.warning("Failure while closing build event transport: " + e); + log.warning("Failure while closing build event transport: " + e); } } } @@ -151,33 +151,12 @@ public class BuildEventStreamer implements EventHandler { @Subscribe public void buildInterrupted(BuildInterruptedEvent event) { abortReason = AbortReason.USER_INTERRUPTED; - }; - - @Subscribe - public void buildComplete(BuildCompleteEvent event) { - clearPendingEvents(); - post(ProgressEvent.finalProgressUpdate(progressCount)); - clearAnnouncedEvents(); - close(); } @Subscribe public void buildEvent(BuildEvent event) { - if (event instanceof ActionExecutedEvent) { - // We ignore events about action executions if the execution succeeded. - if (((ActionExecutedEvent) event).getException() == null) { - return; - } - } - - if (event instanceof BuildEventWithOrderConstraint) { - // Check if all prerequisit events are posted already. - for (BuildEventId prerequisiteId : ((BuildEventWithOrderConstraint) event).postedAfter()) { - if (!postedEvents.contains(prerequisiteId)) { - pendingEvents.put(prerequisiteId, event); - return; - } - } + if (isActionWithoutError(event) || bufferUntilPrerequisitesReceived(event)) { + return; } post(event); @@ -187,10 +166,40 @@ public class BuildEventStreamer implements EventHandler { for (BuildEvent freedEvent : toReconsider) { buildEvent(freedEvent); } + + if (event instanceof BuildCompleteEvent) { + buildComplete(); + } } @VisibleForTesting ImmutableSet<BuildEventTransport> getTransports() { return ImmutableSet.copyOf(transports); } + + private void buildComplete() { + clearPendingEvents(); + post(ProgressEvent.finalProgressUpdate(progressCount)); + clearAnnouncedEvents(); + close(); + } + + private static boolean isActionWithoutError(BuildEvent event) { + return event instanceof ActionExecutedEvent + && ((ActionExecutedEvent) event).getException() == null; + } + + private boolean bufferUntilPrerequisitesReceived(BuildEvent event) { + if (!(event instanceof BuildEventWithOrderConstraint)) { + return false; + } + // Check if all prerequisite events are posted already. + for (BuildEventId prerequisiteId : ((BuildEventWithOrderConstraint) event).postedAfter()) { + if (!postedEvents.contains(prerequisiteId)) { + pendingEvents.put(prerequisiteId, event); + return true; + } + } + return false; + } } |