Add a method to EvaluationProgressReceiver for getting information on SkyFunction#compute calls.
--
MOS_MIGRATED_REVID=102268773
diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
index 8e64ce0..0a30169 100644
--- a/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
+++ b/src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java
@@ -331,6 +331,9 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {}
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
SkyFunctionName type = skyKey.functionName();
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
index 0e6e419..e507d66 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java
@@ -549,6 +549,9 @@
public void enqueueing(SkyKey skyKey) {}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {}
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
if (skyKey.functionName().equals(SkyFunctions.CONFIGURED_TARGET)) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
index 22bd506..bc3d6b6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java
@@ -1733,6 +1733,9 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {}
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier, EvaluationState state) {
if (ignoreInvalidations) {
return;
diff --git a/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java
index cddfc0c..ef09e52 100644
--- a/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java
+++ b/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java
@@ -20,6 +20,7 @@
* Receiver to inform callers which values have been invalidated. Values may be invalidated and then
* re-validated if they have been found not to be changed.
*/
+@ThreadSafety.ThreadSafe
public interface EvaluationProgressReceiver {
/**
* New state of the value entry after evaluation.
@@ -48,7 +49,6 @@
*
* <p>May be called concurrently from multiple threads, possibly with the same {@code key}.
*/
- @ThreadSafety.ThreadSafe
void invalidated(SkyKey skyKey, InvalidationState state);
/**
@@ -59,10 +59,17 @@
*
* <p>This guarantee is intentionally vague to encourage writing robust implementations.
*/
- @ThreadSafety.ThreadSafe
void enqueueing(SkyKey skyKey);
/**
+ * Notifies that {@code skyFunction.compute(skyKey, ...)} has just been called, for some
+ * appropriate {@link SkyFunction} {@code skyFunction}.
+ *
+ * <p>Notably, this includes {@link SkyFunction#compute} calls due to Skyframe restarts.
+ */
+ void computed(SkyKey skyKey, long elapsedTimeNanos);
+
+ /**
* Notifies that the node for {@code skyKey} has been evaluated.
*
* <p>{@code state} indicates the new state of the node.
@@ -70,6 +77,5 @@
* <p>If the value builder threw an error when building this node, then
* {@code valueSupplier.get()} evaluates to null.
*/
- @ThreadSafety.ThreadSafe
void evaluated(SkyKey skyKey, Supplier<SkyValue> valueSupplier, EvaluationState state);
}
diff --git a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java
index 88bd0ee..991dad6 100644
--- a/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java
+++ b/src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java
@@ -720,9 +720,8 @@
Preconditions.checkState(factory != null, "%s %s", functionName, state);
SkyValue value = null;
- Profiler.instance().startTask(ProfilerTask.SKYFUNCTION, skyKey);
+ long startTime = Profiler.nanoTimeMaybe();
try {
- // TODO(bazel-team): count how many of these calls returns null vs. non-null
value = factory.compute(skyKey, env);
} catch (final SkyFunctionException builderException) {
ReifiedSkyFunctionException reifiedBuilderException =
@@ -762,7 +761,14 @@
throw new RuntimeException(msg, re);
} finally {
env.doneBuilding();
- Profiler.instance().completeTask(ProfilerTask.SKYFUNCTION);
+ long elapsedTimeNanos = Profiler.nanoTimeMaybe() - startTime;
+ if (elapsedTimeNanos > 0) {
+ if (progressReceiver != null) {
+ progressReceiver.computed(skyKey, elapsedTimeNanos);
+ }
+ Profiler.instance().logSimpleTaskDuration(startTime, elapsedTimeNanos,
+ ProfilerTask.SKYFUNCTION, skyKey);
+ }
}
GroupedListHelper<SkyKey> newDirectDeps = env.newlyRequestedDeps;
diff --git a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
index aa9b036..809277e 100644
--- a/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/EagerInvalidatorTest.java
@@ -183,6 +183,11 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
throw new UnsupportedOperationException();
@@ -220,6 +225,11 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
throw new UnsupportedOperationException();
@@ -259,6 +269,11 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
throw new UnsupportedOperationException();
@@ -370,6 +385,11 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
throw new UnsupportedOperationException();
@@ -399,6 +419,11 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
throw new UnsupportedOperationException();
@@ -495,6 +520,11 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
public void evaluated(
SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
throw new UnsupportedOperationException();
diff --git a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
index 4ca6550..3969dfa 100644
--- a/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
+++ b/src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java
@@ -262,6 +262,9 @@
public void enqueueing(SkyKey key) {}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {}
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
receivedValues.add(skyKey);
@@ -1906,6 +1909,9 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {}
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier,
EvaluationState state) {
evaluatedValues.add(skyKey);
diff --git a/src/test/java/com/google/devtools/build/skyframe/TrackingInvalidationReceiver.java b/src/test/java/com/google/devtools/build/skyframe/TrackingInvalidationReceiver.java
index 090f04a..2346550 100644
--- a/src/test/java/com/google/devtools/build/skyframe/TrackingInvalidationReceiver.java
+++ b/src/test/java/com/google/devtools/build/skyframe/TrackingInvalidationReceiver.java
@@ -50,6 +50,9 @@
}
@Override
+ public void computed(SkyKey skyKey, long elapsedTimeNanos) {}
+
+ @Override
public void evaluated(SkyKey skyKey, Supplier<SkyValue> skyValueSupplier, EvaluationState state) {
evaluated.add(skyKey);
if (skyValueSupplier.get() != null) {