diff options
author | 2015-09-03 19:27:38 +0000 | |
---|---|---|
committer | 2015-09-03 22:18:22 +0000 | |
commit | 6f094bb3573b4fa552223ce17a229a7f1fec9a62 (patch) | |
tree | 6a0403f63474805b3ae913958ae350c934d31826 /src/main | |
parent | a39ae267b69c015890aa0a38b04194e68a8ce67a (diff) |
Add a method to EvaluationProgressReceiver for getting information on SkyFunction#compute calls.
--
MOS_MIGRATED_REVID=102268773
Diffstat (limited to 'src/main')
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; |