Skip to content

Commit b51b31d

Browse files
coeuvrecopybara-github
authored andcommitted
Remote: Fix a race when reporting action progresses.
Fixes #13713. I will create checkpick request for 4.2.0 once merged into main branch. Closes #13719. PiperOrigin-RevId: 386213448
1 parent de45065 commit b51b31d

File tree

1 file changed

+13
-3
lines changed

1 file changed

+13
-3
lines changed

src/main/java/com/google/devtools/build/lib/runtime/UiStateTracker.java

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,14 @@
6262
import java.util.LinkedHashMap;
6363
import java.util.List;
6464
import java.util.Map;
65+
import java.util.Optional;
6566
import java.util.PriorityQueue;
6667
import java.util.Set;
6768
import java.util.TreeMap;
6869
import java.util.concurrent.ConcurrentHashMap;
6970
import java.util.concurrent.atomic.AtomicInteger;
7071
import javax.annotation.Nullable;
72+
import javax.annotation.concurrent.GuardedBy;
7173
import javax.annotation.concurrent.ThreadSafe;
7274

7375
/** Tracks state for the UI. */
@@ -228,6 +230,7 @@ private ProgressState(String id, long nanoStartTime) {
228230
}
229231
}
230232

233+
@GuardedBy("this")
231234
private final LinkedHashMap<String, ProgressState> runningProgresses = new LinkedHashMap<>();
232235

233236
/** Starts tracking the state of an action. */
@@ -333,6 +336,13 @@ synchronized void onProgressEvent(ActionProgressEvent event, long nanoChangeTime
333336
state.latestEvent = event;
334337
}
335338

339+
synchronized Optional<ProgressState> firstProgress() {
340+
if (runningProgresses.isEmpty()) {
341+
return Optional.empty();
342+
}
343+
return Optional.of(runningProgresses.entrySet().iterator().next().getValue());
344+
}
345+
336346
/** Generates a human-readable description of this action's state. */
337347
synchronized String describe() {
338348
if (runningStrategiesBitmap != 0) {
@@ -705,12 +715,12 @@ private String describeTestGroup(
705715
}
706716

707717
private String describeActionProgress(ActionState action, int desiredWidth) {
708-
if (action.runningProgresses.isEmpty()) {
718+
Optional<ActionState.ProgressState> stateOpt = action.firstProgress();
719+
if (!stateOpt.isPresent()) {
709720
return "";
710721
}
711722

712-
ActionState.ProgressState state =
713-
action.runningProgresses.entrySet().iterator().next().getValue();
723+
ActionState.ProgressState state = stateOpt.get();
714724
ActionProgressEvent event = state.latestEvent;
715725
String message = event.progress();
716726
if (message.isEmpty()) {

0 commit comments

Comments
 (0)