aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main
diff options
context:
space:
mode:
authorGravatar Nathan Harmata <nharmata@google.com>2015-09-03 19:27:38 +0000
committerGravatar David Chen <dzc@google.com>2015-09-03 22:18:22 +0000
commit6f094bb3573b4fa552223ce17a229a7f1fec9a62 (patch)
tree6a0403f63474805b3ae913958ae350c934d31826 /src/main
parenta39ae267b69c015890aa0a38b04194e68a8ce67a (diff)
Add a method to EvaluationProgressReceiver for getting information on SkyFunction#compute calls.
-- MOS_MIGRATED_REVID=102268773
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/SkyframeBuilder.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java3
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java12
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/ParallelEvaluator.java12
5 files changed, 27 insertions, 6 deletions
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 8e64ce04ab..0a301695c7 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 @@ public class SkyframeBuilder implements Builder {
}
@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 0e6e4197ff..e507d6697d 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 final class SkyframeBuildView {
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 22bd506670..bc3d6b6551 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 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory {
}
@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 cddfc0cd14..ef09e5263c 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 @@ import com.google.devtools.build.lib.concurrent.ThreadSafety;
* 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 @@ public interface EvaluationProgressReceiver {
*
* <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 @@ public interface EvaluationProgressReceiver {
*
* <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 @@ public interface EvaluationProgressReceiver {
* <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 88bd0ee22c..991dad63a8 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 @@ public final class ParallelEvaluator implements Evaluator {
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 @@ public final class ParallelEvaluator implements Evaluator {
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;