aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--src/main/java/com/google/devtools/build/lib/actions/ActionResult.java24
-rw-r--r--src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java56
2 files changed, 74 insertions, 6 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java b/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java
index 0b8fa0143d..c2fd3490d9 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionResult.java
@@ -14,6 +14,8 @@
package com.google.devtools.build.lib.actions;
+import static com.google.common.base.Preconditions.checkState;
+
import com.google.auto.value.AutoValue;
import com.google.common.collect.ImmutableList;
import java.time.Duration;
@@ -92,6 +94,28 @@ public abstract class ActionResult {
return getCumulativeTime(spawnResult -> spawnResult.getSystemTime());
}
+ /**
+ * Returns the cumulative command execution CPU time for the {@link Action}.
+ *
+ * @return the cumulative measurement, or empty in case of execution errors or when the
+ * measurement is not implemented for the current platform
+ */
+ public Optional<Duration> cumulativeCommandExecutionCpuTime() {
+ Optional<Duration> userTime = cumulativeCommandExecutionUserTime();
+ Optional<Duration> systemTime = cumulativeCommandExecutionSystemTime();
+
+ if (!userTime.isPresent() && !systemTime.isPresent()) {
+ return Optional.empty();
+ } else if (userTime.isPresent() && !systemTime.isPresent()) {
+ return userTime;
+ } else if (!userTime.isPresent() && systemTime.isPresent()) {
+ return systemTime;
+ } else {
+ checkState(userTime.isPresent() && systemTime.isPresent());
+ return Optional.of(userTime.get().plus(systemTime.get()));
+ }
+ }
+
/** Creates an ActionResult given a list of SpawnResults. */
public static ActionResult create(List<SpawnResult> spawnResults) {
if (spawnResults == null) {
diff --git a/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java b/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java
index 87081ea417..a5b186aa82 100644
--- a/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java
+++ b/src/test/java/com/google/devtools/build/lib/actions/ActionResultTest.java
@@ -31,6 +31,7 @@ public final class ActionResultTest {
List<SpawnResult> spawnResults = ImmutableList.of();
ActionResult actionResult = ActionResult.create(spawnResults);
assertThat(actionResult.cumulativeCommandExecutionWallTime()).isEmpty();
+ assertThat(actionResult.cumulativeCommandExecutionCpuTime()).isEmpty();
assertThat(actionResult.cumulativeCommandExecutionUserTime()).isEmpty();
assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isEmpty();
}
@@ -46,11 +47,9 @@ public final class ActionResultTest {
.build();
List<SpawnResult> spawnResults = ImmutableList.of(spawnResult);
ActionResult actionResult = ActionResult.create(spawnResults);
- assertThat(actionResult.cumulativeCommandExecutionWallTime()).isPresent();
assertThat(actionResult.cumulativeCommandExecutionWallTime()).hasValue(Duration.ofMillis(1984));
- assertThat(actionResult.cumulativeCommandExecutionUserTime()).isPresent();
+ assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(267));
assertThat(actionResult.cumulativeCommandExecutionUserTime()).hasValue(Duration.ofMillis(225));
- assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isPresent();
assertThat(actionResult.cumulativeCommandExecutionSystemTime()).hasValue(Duration.ofMillis(42));
}
@@ -79,11 +78,9 @@ public final class ActionResultTest {
.build();
List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3);
ActionResult actionResult = ActionResult.create(spawnResults);
- assertThat(actionResult.cumulativeCommandExecutionWallTime()).isPresent();
assertThat(actionResult.cumulativeCommandExecutionWallTime()).hasValue(Duration.ofMillis(1984));
- assertThat(actionResult.cumulativeCommandExecutionUserTime()).isPresent();
+ assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(46));
assertThat(actionResult.cumulativeCommandExecutionUserTime()).hasValue(Duration.ofMillis(4));
- assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isPresent();
assertThat(actionResult.cumulativeCommandExecutionSystemTime()).hasValue(Duration.ofMillis(42));
}
@@ -98,7 +95,54 @@ public final class ActionResultTest {
List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3);
ActionResult actionResult = ActionResult.create(spawnResults);
assertThat(actionResult.cumulativeCommandExecutionWallTime()).isEmpty();
+ assertThat(actionResult.cumulativeCommandExecutionCpuTime()).isEmpty();
assertThat(actionResult.cumulativeCommandExecutionUserTime()).isEmpty();
assertThat(actionResult.cumulativeCommandExecutionSystemTime()).isEmpty();
}
+
+ @Test
+ public void testCumulativeCommandExecutionTime_ManySpawnResults_ButOnlyUserTime() {
+ SpawnResult spawnResult1 =
+ new SpawnResult.Builder()
+ .setUserTime(Duration.ofMillis(2))
+ .setStatus(SpawnResult.Status.SUCCESS)
+ .build();
+ SpawnResult spawnResult2 =
+ new SpawnResult.Builder()
+ .setUserTime(Duration.ofMillis(3))
+ .setStatus(SpawnResult.Status.SUCCESS)
+ .build();
+ SpawnResult spawnResult3 =
+ new SpawnResult.Builder()
+ .setUserTime(Duration.ofMillis(4))
+ .setStatus(SpawnResult.Status.SUCCESS)
+ .build();
+ List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3);
+ ActionResult actionResult = ActionResult.create(spawnResults);
+ assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(9));
+ assertThat(actionResult.cumulativeCommandExecutionUserTime()).hasValue(Duration.ofMillis(9));
+ }
+
+ @Test
+ public void testCumulativeCommandExecutionTime_ManySpawnResults_ButOnlySystemTime() {
+ SpawnResult spawnResult1 =
+ new SpawnResult.Builder()
+ .setSystemTime(Duration.ofMillis(33))
+ .setStatus(SpawnResult.Status.SUCCESS)
+ .build();
+ SpawnResult spawnResult2 =
+ new SpawnResult.Builder()
+ .setSystemTime(Duration.ofMillis(7))
+ .setStatus(SpawnResult.Status.SUCCESS)
+ .build();
+ SpawnResult spawnResult3 =
+ new SpawnResult.Builder()
+ .setSystemTime(Duration.ofMillis(2))
+ .setStatus(SpawnResult.Status.SUCCESS)
+ .build();
+ List<SpawnResult> spawnResults = ImmutableList.of(spawnResult1, spawnResult2, spawnResult3);
+ ActionResult actionResult = ActionResult.create(spawnResults);
+ assertThat(actionResult.cumulativeCommandExecutionCpuTime()).hasValue(Duration.ofMillis(42));
+ assertThat(actionResult.cumulativeCommandExecutionSystemTime()).hasValue(Duration.ofMillis(42));
+ }
}