diff options
author | 2016-02-25 12:51:25 +0000 | |
---|---|---|
committer | 2016-02-25 14:16:25 +0000 | |
commit | c211b25a9c43704d1dbeb46aa47671fe854e7a7e (patch) | |
tree | 80f46c4efb45c97cc2a9ec288b15d7546b8a0210 /src/main/java/com/google/devtools | |
parent | 26f7f4849d4f56d23d21111ee17248ab64065009 (diff) |
Keep track of actions currently running
Subscribe to start and completion events of actions to keep track
of which actions are currently running. In the progress bar show
up to 3 actions currently running, giving preference to the ones
that started the most early. Also keep track of completion of
analysis and build.
--
Change-Id: I9183a84821abca85e2331baa059e1f636d756caf
Reviewed-on: https://bazel-review.googlesource.com/#/c/3016
MOS_MIGRATED_REVID=115549337
Diffstat (limited to 'src/main/java/com/google/devtools')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java | 45 | ||||
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java | 84 |
2 files changed, 124 insertions, 5 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java index 6b710c21b7..1c86ac0d14 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalEventHandler.java @@ -14,6 +14,11 @@ package com.google.devtools.build.lib.runtime; import com.google.common.eventbus.Subscribe; +import com.google.devtools.build.lib.actions.ActionCompletionEvent; +import com.google.devtools.build.lib.actions.ActionStartedEvent; +import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent; +import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent; +import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent; import com.google.devtools.build.lib.events.Event; import com.google.devtools.build.lib.events.EventKind; import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent; @@ -80,6 +85,12 @@ public class ExperimentalEventHandler extends BlazeCommandEventHandler { } @Subscribe + public void buildStarted(BuildStartingEvent event) { + stateTracker.buildStarted(event); + refresh(); + } + + @Subscribe public void loadingComplete(LoadingPhaseCompleteEvent event) { stateTracker.loadingComplete(event); try { @@ -94,6 +105,40 @@ public class ExperimentalEventHandler extends BlazeCommandEventHandler { } } + @Subscribe + public void analysisComplete(AnalysisPhaseCompleteEvent event) { + stateTracker.analysisComplete(event); + refresh(); + } + + @Subscribe + public void buildComplete(BuildCompleteEvent event) { + stateTracker.buildComplete(event); + refresh(); + } + + @Subscribe + public void actionStarted(ActionStartedEvent event) { + stateTracker.actionStarted(event); + refresh(); + } + + @Subscribe + public void actionCompletion(ActionCompletionEvent event) { + stateTracker.actionCompletion(event); + refresh(); + } + + private synchronized void refresh() { + try { + clearProgressBar(); + addProgressBar(); + terminal.flush(); + } catch (IOException e) { + LOG.warning("IO Error writing to output stream: " + e); + } + } + public void resetTerminal() { try { terminal.resetTerminal(); diff --git a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java index d87fafe41e..c422b26654 100644 --- a/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java +++ b/src/main/java/com/google/devtools/build/lib/runtime/ExperimentalStateTracker.java @@ -13,28 +13,102 @@ // limitations under the License. package com.google.devtools.build.lib.runtime; +import com.google.devtools.build.lib.actions.ActionCompletionEvent; +import com.google.devtools.build.lib.actions.ActionStartedEvent; +import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent; +import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent; +import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent; import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent; import com.google.devtools.build.lib.util.io.AnsiTerminalWriter; import java.io.IOException; +import java.util.ArrayDeque; +import java.util.Deque; /** * An experimental state tracker for the new experimental UI. */ class ExperimentalStateTracker { - private String statusMessage; + static final int SAMPLE_SIZE = 3; + + private String status; + private String additionalMessage; + private int actionsStarted; + private int actionsCompleted; + private final Deque<String> runningActions; + private boolean ok; ExperimentalStateTracker() { - statusMessage = "Loading"; + this.runningActions = new ArrayDeque<>(); + this.ok = true; + } + + void buildStarted(BuildStartingEvent event) { + status = "Loading"; + additionalMessage = ""; } void loadingComplete(LoadingPhaseCompleteEvent event) { int count = event.getTargets().size(); - statusMessage = "Loaded " + count + " targets, continuing work..."; + status = "Analysing"; + additionalMessage = "" + count + " targets"; + } + + void analysisComplete(AnalysisPhaseCompleteEvent event) { + status = null; + } + + void buildComplete(BuildCompleteEvent event) { + if (event.getResult().getSuccess()) { + status = "INFO"; + additionalMessage = "Build completed successfully, " + actionsCompleted + " total actions"; + } else { + ok = false; + status = "FAILED"; + additionalMessage = "Build did NOT complete successfully"; + } + } + + synchronized void actionStarted(ActionStartedEvent event) { + actionsStarted++; + String name = event.getAction().getPrimaryOutput().getPath().getPathString(); + runningActions.addLast(name); + } + + synchronized void actionCompletion(ActionCompletionEvent event) { + actionsCompleted++; + String name = event.getAction().getPrimaryOutput().getPath().getPathString(); + runningActions.remove(name); + } + + private void sampleOldestActions(AnsiTerminalWriter terminalWriter) throws IOException { + int count = 0; + for (String action : runningActions) { + count++; + terminalWriter.newline().append(" " + action); + if (count >= SAMPLE_SIZE) { + break; + } + } + if (count < runningActions.size()) { + terminalWriter.newline().append(" ..."); + } } - void writeProgressBar(AnsiTerminalWriter terminalWriter) throws IOException { - terminalWriter.okStatus().append("NOW:").normal().append(" " + statusMessage); + synchronized void writeProgressBar(AnsiTerminalWriter terminalWriter) throws IOException { + if (status != null) { + if (ok) { + terminalWriter.okStatus(); + } else { + terminalWriter.failStatus(); + } + terminalWriter.append(status + ":").normal().append(" " + additionalMessage); + return; + } + String statusMessage = " " + actionsCompleted + " actions completed, " + + (actionsStarted - actionsCompleted) + " actions running"; + terminalWriter.okStatus().append("Building:").normal().append(" " + statusMessage); + sampleOldestActions(terminalWriter); } } |