aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Klaus Aehlig <aehlig@google.com>2017-06-26 15:30:55 +0200
committerGravatar Marcel Hlopko <hlopko@google.com>2017-06-26 18:42:33 +0200
commit8f6549fcca1838e2bbb0ec0dc52fc8b83c923c8e (patch)
tree4dbc2170b9669fcd0809097424af0c9a86599481 /src/main
parent205125bfceffd1920a80799e4097d6433687ca71 (diff)
Make BuildEventStreamer flushable before first event
Make the BuildEventStreamer capable of handling the flush() method, even before the initial build event is seen. This happens, if a lot (more than 10240 bytes) of output is produced before the BuildStartingEvent is generated- This is not unlikely, as the whole option processing happens before the build starts. As the promise of flush() is that the OutErrProvider is cleared, and that all output between two flush() get into separate events, numbered in order, we have to temporarily store a list of stdout/stderr String pairs. RELNOTES: None. PiperOrigin-RevId: 160137478
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/runtime/BuildEventStreamer.java44
1 files changed, 37 insertions, 7 deletions
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 66aaa7fe36..e10444b325 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
@@ -56,6 +56,7 @@ import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventHandler;
import com.google.devtools.build.lib.events.Reporter;
import com.google.devtools.build.lib.rules.extra.ExtraAction;
+import com.google.devtools.build.lib.util.Pair;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
@@ -86,6 +87,7 @@ public class BuildEventStreamer implements EventHandler {
private Set<BuildEventId> announcedEvents;
private final Set<BuildEventId> postedEvents = new HashSet<>();
private final Set<BuildEventId> configurationsPosted = new HashSet<>();
+ private List<Pair<String, String>> bufferedStdoutStderrPairs = new ArrayList<>();
private final Multimap<BuildEventId, BuildEvent> pendingEvents = HashMultimap.create();
private int progressCount;
private final CountingArtifactGroupNamer artifactGroupNamer = new CountingArtifactGroupNamer();
@@ -168,6 +170,7 @@ public class BuildEventStreamer implements EventHandler {
private void post(BuildEvent event) {
BuildEvent linkEvent = null;
BuildEventId id = event.getEventId();
+ List<BuildEvent> flushEvents = null;
synchronized (this) {
if (announcedEvents == null) {
@@ -182,6 +185,14 @@ public class BuildEventStreamer implements EventHandler {
if (reporter != null) {
reporter.post(new AnnounceBuildEventTransportsEvent(transports));
}
+
+ if (!bufferedStdoutStderrPairs.isEmpty()) {
+ flushEvents = new ArrayList<>(bufferedStdoutStderrPairs.size());
+ for (Pair<String, String> outErrPair : bufferedStdoutStderrPairs) {
+ flushEvents.add(flushStdoutStderrEvent(outErrPair.getFirst(), outErrPair.getSecond()));
+ }
+ }
+ bufferedStdoutStderrPairs = null;
} else {
if (!announcedEvents.contains(id)) {
String out = null;
@@ -215,6 +226,14 @@ public class BuildEventStreamer implements EventHandler {
}
transport.sendBuildEvent(event, artifactGroupNamer);
}
+
+ if (flushEvents != null) {
+ for (BuildEvent flushEvent : flushEvents) {
+ for (BuildEventTransport transport : transports) {
+ transport.sendBuildEvent(flushEvent, artifactGroupNamer);
+ }
+ }
+ }
}
/** Clear pending events by generating aborted events for all their requisits. */
@@ -383,8 +402,16 @@ public class BuildEventStreamer implements EventHandler {
}
}
+ private synchronized BuildEvent flushStdoutStderrEvent(String out, String err) {
+ BuildEvent updateEvent = ProgressEvent.progressUpdate(progressCount, out, err);
+ progressCount++;
+ announcedEvents.addAll(updateEvent.getChildrenEvents());
+ postedEvents.add(updateEvent.getEventId());
+ return updateEvent;
+ }
+
void flush() {
- BuildEvent updateEvent;
+ BuildEvent updateEvent = null;
synchronized (this) {
String out = null;
String err = null;
@@ -392,13 +419,16 @@ public class BuildEventStreamer implements EventHandler {
out = outErrProvider.getOut();
err = outErrProvider.getErr();
}
- updateEvent = ProgressEvent.progressUpdate(progressCount, out, err);
- progressCount++;
- announcedEvents.addAll(updateEvent.getChildrenEvents());
- postedEvents.add(updateEvent.getEventId());
+ if (announcedEvents != null) {
+ updateEvent = flushStdoutStderrEvent(out, err);
+ } else {
+ bufferedStdoutStderrPairs.add(Pair.of(out, err));
+ }
}
- for (BuildEventTransport transport : transports) {
- transport.sendBuildEvent(updateEvent, artifactGroupNamer);
+ if (updateEvent != null) {
+ for (BuildEventTransport transport : transports) {
+ transport.sendBuildEvent(updateEvent, artifactGroupNamer);
+ }
}
}