UI: present number of fetches
When bazel fetches more external repositories simultaneously
than our UI is told to show samples, at least indicate the total
number of fetches running in parallel.
Change-Id: I6a9e98bf7df9144a7de21d25308c8834122a4c4a
PiperOrigin-RevId: 218823475
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 7aa35cf..59c5257 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
@@ -740,6 +740,7 @@
int count = 0;
long nanoTime = clock.nanoTime();
int downloadCount = runningDownloads.size();
+ String suffix = AND_MORE + " (" + downloadCount + " fetches)";
for (String url : runningDownloads) {
if (count >= sampleSize) {
break;
@@ -751,11 +752,11 @@
nanoTime,
targetWidth
- FETCH_PREFIX.length()
- - ((count >= sampleSize && count < downloadCount) ? AND_MORE.length() : 0),
+ - ((count >= sampleSize && count < downloadCount) ? suffix.length() : 0),
terminalWriter);
}
if (count < downloadCount) {
- terminalWriter.append(AND_MORE);
+ terminalWriter.append(suffix);
}
}
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 bf20766..dd7d6e6 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
@@ -42,6 +42,7 @@
import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent;
import com.google.devtools.build.lib.buildtool.buildevent.TestFilteringCompleteEvent;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.events.ExtendedEventHandler.FetchProgress;
import com.google.devtools.build.lib.packages.AspectDescriptor;
import com.google.devtools.build.lib.skyframe.LoadingPhaseStartedEvent;
import com.google.devtools.build.lib.skyframe.PackageProgressReceiver;
@@ -1066,4 +1067,46 @@
when(transport.name()).thenReturn(name);
return transport;
}
+
+ @Test
+ public void testTotalFetchesReported() throws IOException {
+ ManualClock clock = new ManualClock();
+ ExperimentalStateTracker stateTracker = new ExperimentalStateTracker(clock, 80);
+
+ stateTracker.buildStarted(null);
+ for (int i = 0; i < 30; i++) {
+ stateTracker.downloadProgress(new FetchEvent("@repoFoo" + i));
+ }
+ clock.advanceMillis(TimeUnit.SECONDS.toMillis(7));
+
+ LoggingTerminalWriter terminalWriter = new LoggingTerminalWriter(true);
+ stateTracker.writeProgressBar(terminalWriter);
+ String output = terminalWriter.getTranscript();
+ assertThat(output, containsString("@repoFoo"));
+ assertThat(output, containsString("7s"));
+ assertThat(output, containsString("30 fetches"));
+ }
+
+ private static class FetchEvent implements FetchProgress {
+ private final String id;
+
+ FetchEvent(String id) {
+ this.id = id;
+ }
+
+ @Override
+ public String getResourceIdentifier() {
+ return id;
+ }
+
+ @Override
+ public String getProgress() {
+ return "working...";
+ }
+
+ @Override
+ public boolean isFinished() {
+ return false;
+ }
+ }
}