Pass through the clock to the ExperimentalStateTracker
In this way, the ExperimentalStateTracker has access to all the information needed
to provide information about the run-time of currently running actions.
--
Change-Id: I0f4e48f39e9ebe63555e4bb1d70df2a6dbb65430
Reviewed-on: https://bazel-review.googlesource.com/#/c/3204
MOS_MIGRATED_REVID=118929758
diff --git a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
index cddb96c..d3d00b4 100644
--- a/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
+++ b/src/main/java/com/google/devtools/build/lib/runtime/BlazeCommandDispatcher.java
@@ -635,7 +635,7 @@
EventHandler eventHandler;
if (eventOptions.experimentalUi) {
// The experimental event handler is not to be rate limited.
- return new ExperimentalEventHandler(outErr, eventOptions);
+ return new ExperimentalEventHandler(outErr, eventOptions, runtime.getClock());
} else if ((eventOptions.useColor() || eventOptions.useCursorControl())) {
eventHandler = new FancyTerminalEventHandler(outErr, eventOptions);
} else {
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 a67dc2a..0073c24 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
@@ -24,6 +24,7 @@
import com.google.devtools.build.lib.events.Event;
import com.google.devtools.build.lib.events.EventKind;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent;
+import com.google.devtools.build.lib.util.Clock;
import com.google.devtools.build.lib.util.io.AnsiTerminal;
import com.google.devtools.build.lib.util.io.LineCountingAnsiTerminalWriter;
import com.google.devtools.build.lib.util.io.LineWrappingAnsiTerminalWriter;
@@ -49,12 +50,13 @@
public final int terminalWidth;
- public ExperimentalEventHandler(OutErr outErr, BlazeCommandEventHandler.Options options) {
+ public ExperimentalEventHandler(
+ OutErr outErr, BlazeCommandEventHandler.Options options, Clock clock) {
super(outErr, options);
this.terminal = new AnsiTerminal(outErr.getErrorStream());
this.terminalWidth = (options.terminalColumns > 0 ? options.terminalColumns : 80);
this.debugAllEvents = options.experimentalUiDebugAllEvents;
- this.stateTracker = new ExperimentalStateTracker();
+ this.stateTracker = new ExperimentalStateTracker(clock);
this.numLinesProgressBar = 0;
}
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 02086ba..7c0acb7 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
@@ -22,6 +22,7 @@
import com.google.devtools.build.lib.buildtool.buildevent.BuildStartingEvent;
import com.google.devtools.build.lib.buildtool.buildevent.ExecutionProgressReceiverAvailableEvent;
import com.google.devtools.build.lib.pkgcache.LoadingPhaseCompleteEvent;
+import com.google.devtools.build.lib.util.Clock;
import com.google.devtools.build.lib.util.io.AnsiTerminalWriter;
import java.io.IOException;
@@ -40,6 +41,8 @@
private String status;
private String additionalMessage;
+ private final Clock clock;
+
// currently running actions, using the path of the primary
// output as unique identifier.
private final Deque<String> runningActions;
@@ -50,10 +53,11 @@
private ExecutionProgressReceiver executionProgressReceiver;
- ExperimentalStateTracker() {
+ ExperimentalStateTracker(Clock clock) {
this.runningActions = new ArrayDeque<>();
this.actions = new TreeMap<>();
this.ok = true;
+ this.clock = clock;
}
void buildStarted(BuildStartingEvent event) {
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
index 973b13a..0f833d1 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/ExperimentalStateTrackerTest.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.actions.Root;
import com.google.devtools.build.lib.testutil.FoundationTestCase;
+import com.google.devtools.build.lib.testutil.ManualClock;
import com.google.devtools.build.lib.util.io.AnsiTerminalWriter;
import com.google.devtools.build.lib.vfs.Path;
import com.google.devtools.build.lib.vfs.PathFragment;
@@ -94,8 +95,10 @@
// somewhere in the progress bar.
String message = "Building foo";
+ ManualClock clock = new ManualClock();
+ clock.advanceMillis(120000);
- ExperimentalStateTracker stateTracker = new ExperimentalStateTracker();
+ ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
stateTracker.actionStarted(new ActionStartedEvent(mockAction(message, "bar/foo"), 123456789));
LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter();
stateTracker.writeProgressBar(terminalWriter);
@@ -113,9 +116,11 @@
String messageFast = "Running quick action";
String messageSlow = "Running slow action";
+ ManualClock clock = new ManualClock();
+ clock.advanceMillis(120000);
Action fastAction = mockAction(messageFast, "foo/fast");
Action slowAction = mockAction(messageSlow, "bar/slow");
- ExperimentalStateTracker stateTracker = new ExperimentalStateTracker();
+ ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
stateTracker.actionStarted(new ActionStartedEvent(fastAction, 123456789));
stateTracker.actionStarted(new ActionStartedEvent(slowAction, 123456999));
stateTracker.actionCompletion(new ActionCompletionEvent(20, fastAction));
@@ -138,7 +143,9 @@
String messageOld = "Running the first-started action";
- ExperimentalStateTracker stateTracker = new ExperimentalStateTracker();
+ ManualClock clock = new ManualClock();
+ clock.advanceMillis(120000);
+ ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock);
stateTracker.actionStarted(
new ActionStartedEvent(mockAction(messageOld, "bar/foo"), 123456789));
for (int i = 0; i < 30; i++) {