diff options
author | 2017-06-26 15:30:55 +0200 | |
---|---|---|
committer | 2017-06-26 18:42:33 +0200 | |
commit | 8f6549fcca1838e2bbb0ec0dc52fc8b83c923c8e (patch) | |
tree | 4dbc2170b9669fcd0809097424af0c9a86599481 /src/main | |
parent | 205125bfceffd1920a80799e4097d6433687ca71 (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.java | 44 |
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); + } } } |