diff options
author | tomlu <tomlu@google.com> | 2018-06-19 15:07:26 -0700 |
---|---|---|
committer | Copybara-Service <copybara-piper@google.com> | 2018-06-19 15:09:17 -0700 |
commit | a0e8aae4b30a23d6a3069c343a47cd56b5ed3809 (patch) | |
tree | 255a02dc61f029f3495ca7bbee4f54bc1a6fa40c | |
parent | af545684f4f9c2697951d291d00ae2106ff65041 (diff) |
Add new BuildMetrics event to BEP.
To start we add just a single metric, the number of actions constructed in the current build.
RELNOTES: None
PiperOrigin-RevId: 201248490
25 files changed, 281 insertions, 18 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/BUILD b/src/main/java/com/google/devtools/build/lib/BUILD index 210db2e347..6aba57938c 100644 --- a/src/main/java/com/google/devtools/build/lib/BUILD +++ b/src/main/java/com/google/devtools/build/lib/BUILD @@ -33,6 +33,7 @@ filegroup( "//src/main/java/com/google/devtools/build/lib/exec/apple:srcs", "//src/main/java/com/google/devtools/build/lib/exec/local:srcs", "//src/main/java/com/google/devtools/build/lib/graph:srcs", + "//src/main/java/com/google/devtools/build/lib/metrics:srcs", "//src/main/java/com/google/devtools/build/lib/profiler:srcs", "//src/main/java/com/google/devtools/build/lib/profiler/callcounts:srcs", "//src/main/java/com/google/devtools/build/lib/profiler/memory:srcs", @@ -721,6 +722,7 @@ java_library( "//src/main/java/com/google/devtools/build/lib/bazel/repository/cache", "//src/main/java/com/google/devtools/build/lib/bazel/repository/downloader", "//src/main/java/com/google/devtools/build/lib/buildeventservice", + "//src/main/java/com/google/devtools/build/lib/metrics:metrics_module", "//src/main/java/com/google/devtools/build/lib/profiler/callcounts:callcounts_module", "//src/main/java/com/google/devtools/build/lib/profiler/memory:allocationtracker_module", "//src/main/java/com/google/devtools/build/lib/remote", diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseCompleteEvent.java index 063c5716d0..9749b0cfee 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseCompleteEvent.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseCompleteEvent.java @@ -17,7 +17,6 @@ package com.google.devtools.build.lib.analysis; import static com.google.devtools.build.lib.pkgcache.PackageManager.PackageManagerStatistics; import com.google.common.collect.ImmutableList; - import java.util.Collection; /** @@ -29,17 +28,24 @@ public class AnalysisPhaseCompleteEvent { private final long timeInMs; private int targetsVisited; private final PackageManagerStatistics pkgManagerStats; + private final int actionsConstructed; /** * Construct the event. + * * @param topLevelTargets The set of active topLevelTargets that remain. */ - public AnalysisPhaseCompleteEvent(Collection<? extends ConfiguredTarget> topLevelTargets, - int targetsVisited, long timeInMs, PackageManagerStatistics pkgManagerStats) { + public AnalysisPhaseCompleteEvent( + Collection<? extends ConfiguredTarget> topLevelTargets, + int targetsVisited, + long timeInMs, + PackageManagerStatistics pkgManagerStats, + int actionsConstructed) { this.timeInMs = timeInMs; this.topLevelTargets = ImmutableList.copyOf(topLevelTargets); this.targetsVisited = targetsVisited; this.pkgManagerStats = pkgManagerStats; + this.actionsConstructed = actionsConstructed; } /** @@ -61,6 +67,10 @@ public class AnalysisPhaseCompleteEvent { return timeInMs; } + public int getActionsConstructed() { + return actionsConstructed; + } + /** * Returns package manager statistics. */ diff --git a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java index c223113d7b..204d94931e 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/BuildView.java @@ -160,6 +160,10 @@ public class BuildView { return skyframeBuildView.getEvaluatedTargetKeys().size(); } + public int getActionsConstructed() { + return skyframeBuildView.getEvaluatedActionCount(); + } + public PackageManagerStatistics getAndClearPkgManagerStatistics() { return skyframeExecutor.getPackageManager().getAndClearStatistics(); } @@ -196,6 +200,7 @@ public class BuildView { pollInterruptedStatus(); skyframeBuildView.resetEvaluatedConfiguredTargetKeysSet(); + skyframeBuildView.resetEvaluationActionCount(); Collection<Target> targets = loadingResult.getTargets(); eventBus.post(new AnalysisPhaseStartedEvent(targets)); diff --git a/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java b/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java index c6cabaa75f..e96c815036 100644 --- a/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java +++ b/src/main/java/com/google/devtools/build/lib/bazel/Bazel.java @@ -58,6 +58,7 @@ public final class Bazel { com.google.devtools.build.lib.buildeventservice.BazelBuildEventServiceModule.class, com.google.devtools.build.lib.profiler.callcounts.CallcountsModule.class, com.google.devtools.build.lib.profiler.memory.AllocationTrackerModule.class, + com.google.devtools.build.lib.metrics.MetricsModule.class, BazelBuiltinCommandModule.class); public static void main(String[] args) { diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java index feab9ba667..97ff7a6844 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java @@ -305,4 +305,12 @@ public final class BuildEventId implements Serializable { BuildEventStreamProtos.BuildEventId.BuildToolLogsId.getDefaultInstance()) .build()); } + + public static BuildEventId buildMetrics() { + return new BuildEventId( + BuildEventStreamProtos.BuildEventId.newBuilder() + .setBuildMetrics( + BuildEventStreamProtos.BuildEventId.BuildMetricsId.getDefaultInstance()) + .build()); + } } diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto index 1323584b49..74bdd0be26 100644 --- a/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto +++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto @@ -188,6 +188,11 @@ message BuildEventId { message BuildToolLogsId { } + // Identifier of an event providing build metrics after completion + // of the build. + message BuildMetricsId { + } + oneof id { UnknownBuildEventId unknown = 1; ProgressId progress = 2; @@ -210,6 +215,7 @@ message BuildEventId { TestSummaryId test_summary = 7; BuildFinishedId build_finished = 9; BuildToolLogsId build_tool_logs = 20; + BuildMetricsId build_metrics = 22; } } @@ -611,6 +617,16 @@ message BuildFinished { int64 finish_time_millis = 2; } +message BuildMetrics { + message ActionSummary { + // The total number of actions created and registered during the build. + // This includes unused actions that were constructed but + // not executed during this build. + int64 actions_created = 1; + } + ActionSummary action_summary = 1; +} + // Event providing additional statistics/logs after completion of the build. message BuildToolLogs { repeated File log = 1; @@ -645,5 +661,6 @@ message BuildEvent { TestSummary test_summary = 9; BuildFinished finished = 14; BuildToolLogs build_tool_logs = 23; + BuildMetrics build_metrics = 24; }; } diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java index 6eddca5e9c..5b09d81401 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java @@ -517,9 +517,14 @@ public class BuildTool { env.getEventBus()); // TODO(bazel-team): Merge these into one event. - env.getEventBus().post(new AnalysisPhaseCompleteEvent(analysisResult.getTargetsToBuild(), - view.getTargetsVisited(), timer.stop().elapsed(TimeUnit.MILLISECONDS), - view.getAndClearPkgManagerStatistics())); + env.getEventBus() + .post( + new AnalysisPhaseCompleteEvent( + analysisResult.getTargetsToBuild(), + view.getTargetsVisited(), + timer.stop().elapsed(TimeUnit.MILLISECONDS), + view.getAndClearPkgManagerStatistics(), + view.getActionsConstructed())); ImmutableSet<BuildConfigurationValue.Key> configurationKeys = Stream.concat( analysisResult @@ -575,7 +580,10 @@ public class BuildTool { // The stop time has to be captured before we send the BuildCompleteEvent. result.setStopTime(runtime.getClock().currentTimeMillis()); env.getEventBus() - .post(new BuildCompleteEvent(result, ImmutableList.of(BuildEventId.buildToolLogs()))); + .post( + new BuildCompleteEvent( + result, + ImmutableList.of(BuildEventId.buildToolLogs(), BuildEventId.buildMetrics()))); if (ie != null) { if (exitCondition.equals(ExitCode.SUCCESS)) { result.setExitCondition(ExitCode.INTERRUPTED); diff --git a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java index b0447fd945..2b614b0630 100644 --- a/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java +++ b/src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java @@ -29,12 +29,14 @@ import com.google.devtools.build.lib.skyframe.TargetCompletionValue; import com.google.devtools.build.skyframe.EvaluationProgressReceiver; import com.google.devtools.build.skyframe.SkyFunctionName; import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; import java.text.NumberFormat; import java.util.Collections; import java.util.Locale; import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; import java.util.function.Supplier; +import javax.annotation.Nullable; /** * Listener for executed actions and built artifacts. We use a listener so that we have an @@ -100,6 +102,7 @@ public final class ExecutionProgressReceiver @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { SkyFunctionName type = skyKey.functionName(); diff --git a/src/main/java/com/google/devtools/build/lib/metrics/BUILD b/src/main/java/com/google/devtools/build/lib/metrics/BUILD new file mode 100644 index 0000000000..3bc0665041 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/metrics/BUILD @@ -0,0 +1,20 @@ +package( + default_visibility = ["//src:__subpackages__"], +) + +filegroup( + name = "srcs", + srcs = glob(["*"]), +) + +java_library( + name = "metrics_module", + srcs = glob(["*.java"]), + deps = [ + "//src/main/java/com/google/devtools/build/lib:build-base", + "//src/main/java/com/google/devtools/build/lib:runtime", + "//src/main/java/com/google/devtools/build/lib/buildeventstream", + "//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto", + "//third_party:guava", + ], +) diff --git a/src/main/java/com/google/devtools/build/lib/metrics/BuildMetricsEvent.java b/src/main/java/com/google/devtools/build/lib/metrics/BuildMetricsEvent.java new file mode 100644 index 0000000000..47784408e4 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/metrics/BuildMetricsEvent.java @@ -0,0 +1,55 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.metrics; + +import com.google.common.collect.ImmutableList; +import com.google.devtools.build.lib.buildeventstream.BuildEventContext; +import com.google.devtools.build.lib.buildeventstream.BuildEventId; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics; +import com.google.devtools.build.lib.buildeventstream.BuildEventWithOrderConstraint; +import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent; +import java.util.Collection; + +class BuildMetricsEvent implements BuildEventWithOrderConstraint { + private final BuildMetrics buildMetrics; + + BuildMetricsEvent(BuildMetrics buildMetrics) { + this.buildMetrics = buildMetrics; + } + + @Override + public BuildEventId getEventId() { + return BuildEventId.buildMetrics(); + } + + @Override + public Collection<BuildEventId> getChildrenEvents() { + return ImmutableList.of(); + } + + @Override + public BuildEventStreamProtos.BuildEvent asStreamProto(BuildEventContext converters) { + return GenericBuildEvent.protoChaining(this).setBuildMetrics(buildMetrics).build(); + } + + public BuildMetrics getBuildMetrics() { + return buildMetrics; + } + + @Override + public Collection<BuildEventId> postedAfter() { + return ImmutableList.of(BuildEventId.buildFinished()); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java b/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java new file mode 100644 index 0000000000..a273a8beb4 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java @@ -0,0 +1,52 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.metrics; + +import com.google.common.eventbus.Subscribe; +import com.google.devtools.build.lib.analysis.AnalysisPhaseCompleteEvent; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics; +import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildMetrics.ActionSummary; +import com.google.devtools.build.lib.buildtool.buildevent.BuildCompleteEvent; +import com.google.devtools.build.lib.runtime.CommandEnvironment; + +class MetricsCollector { + + private final CommandEnvironment env; + private int actionsConstructed; + + MetricsCollector(CommandEnvironment env) { + this.env = env; + env.getEventBus().register(this); + } + + static void installInEnv(CommandEnvironment env) { + new MetricsCollector(env); + } + + @Subscribe + public void onAnalysisPhaseComplete(AnalysisPhaseCompleteEvent event) { + actionsConstructed = event.getActionsConstructed(); + } + + @Subscribe + public void onBuildComplete(BuildCompleteEvent event) { + env.getEventBus().post(new BuildMetricsEvent(createBuildMetrics())); + } + + private BuildMetrics createBuildMetrics() { + return BuildMetrics.newBuilder() + .setActionSummary(ActionSummary.newBuilder().setActionsCreated(actionsConstructed).build()) + .build(); + } +} diff --git a/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java b/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java new file mode 100644 index 0000000000..0c8c32f5b2 --- /dev/null +++ b/src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java @@ -0,0 +1,32 @@ +// Copyright 2018 The Bazel Authors. All rights reserved. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +package com.google.devtools.build.lib.metrics; + +import com.google.devtools.build.lib.runtime.BlazeModule; +import com.google.devtools.build.lib.runtime.CommandEnvironment; + +/** + * A blaze module that installs metrics instrumentations and issues a {@link BuildMetricsEvent} at + * the end of the build. + */ +public class MetricsModule extends BlazeModule { + + @Override + public void beforeCommand(CommandEnvironment env) { + MetricsCollector.installInEnv(env); + } + + @Override + public void afterCommand() {} +} 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 acb7c4a064..c41bf5d224 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 @@ -13,6 +13,8 @@ // limitations under the License. package com.google.devtools.build.lib.skyframe; +import static com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState.BUILT; + import com.google.common.annotations.VisibleForTesting; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -76,11 +78,13 @@ import com.google.devtools.build.skyframe.EvaluationProgressReceiver; import com.google.devtools.build.skyframe.EvaluationResult; import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; import java.util.Collection; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Supplier; import javax.annotation.Nullable; @@ -109,6 +113,8 @@ public final class SkyframeBuildView { private Set<SkyKey> dirtiedConfiguredTargetKeys = Sets.newConcurrentHashSet(); private volatile boolean anyConfiguredTargetDeleted = false; + private final AtomicInteger evaluatedActionCount = new AtomicInteger(); + private final ConfiguredRuleClassProvider ruleClassProvider; // The host configuration containing all fragments used by this build's transitive closure. @@ -148,6 +154,14 @@ public final class SkyframeBuildView { return factory; } + public int getEvaluatedActionCount() { + return evaluatedActionCount.get(); + } + + public void resetEvaluationActionCount() { + evaluatedActionCount.set(0); + } + private boolean areConfigurationsDifferent(BuildConfigurationCollection configurations) { if (this.configurations == null) { // no configurations currently, no need to drop anything @@ -719,6 +733,7 @@ public final class SkyframeBuildView { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { if (skyKey.functionName().equals(SkyFunctions.CONFIGURED_TARGET)) { @@ -729,6 +744,9 @@ public final class SkyframeBuildView { // During multithreaded operation, this is only set to true, so no concurrency issues. someConfiguredTargetEvaluated = true; } + if (value instanceof ConfiguredTargetValue) { + evaluatedActionCount.addAndGet(((ConfiguredTargetValue) value).getNumActions()); + } break; case CLEAN: // If the configured target value did not need to be rebuilt, then it wasn't truly @@ -736,6 +754,10 @@ public final class SkyframeBuildView { dirtiedConfiguredTargetKeys.remove(skyKey); break; } + } else if (skyKey.functionName().equals(SkyFunctions.ASPECT) + && state == BUILT + && value instanceof AspectValue) { + evaluatedActionCount.addAndGet(((AspectValue) value).getNumActions()); } } } 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 32b5ca0d56..b0aee1bb43 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 @@ -2297,14 +2297,17 @@ public abstract class SkyframeExecutor implements WalkableGraphFactory { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { if (ignoreInvalidations) { return; } - skyframeBuildView.getProgressReceiver().evaluated(skyKey, evaluationSuccessState, state); + skyframeBuildView + .getProgressReceiver() + .evaluated(skyKey, value, evaluationSuccessState, state); if (executionProgressReceiver != null) { - executionProgressReceiver.evaluated(skyKey, evaluationSuccessState, state); + executionProgressReceiver.evaluated(skyKey, value, evaluationSuccessState, state); } } } diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java index 9d7bf274f9..20bf5d5879 100644 --- a/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java +++ b/src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java @@ -153,16 +153,19 @@ public abstract class AbstractExceptionalParallelEvaluator<E extends Exception> // retrieve them, but top-level nodes are presumably of more interest. // If valueVersion is not equal to graphVersion, it must be less than it (by the // Preconditions check above), and so the node is clean. + EvaluationState evaluationState = + valueVersion.equals(evaluatorContext.getGraphVersion()) + ? EvaluationState.BUILT + : EvaluationState.CLEAN; evaluatorContext .getProgressReceiver() .evaluated( key, + evaluationState == EvaluationState.BUILT ? value : null, value != null ? EvaluationSuccessState.SUCCESS.supplier() : EvaluationSuccessState.FAILURE.supplier(), - valueVersion.equals(evaluatorContext.getGraphVersion()) - ? EvaluationState.BUILT - : EvaluationState.CLEAN); + evaluationState); } } diff --git a/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java b/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java index 0c94277a4b..5381e33bb4 100644 --- a/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java +++ b/src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java @@ -286,7 +286,8 @@ public abstract class AbstractParallelEvaluator { // Tell the receiver that the value was not actually changed this run. evaluatorContext .getProgressReceiver() - .evaluated(skyKey, new EvaluationSuccessStateSupplier(state), EvaluationState.CLEAN); + .evaluated( + skyKey, null, new EvaluationSuccessStateSupplier(state), EvaluationState.CLEAN); if (!evaluatorContext.keepGoing() && state.getErrorInfo() != null) { if (!evaluatorContext.getVisitor().preventNewEvaluations()) { return DirtyOutcome.ALREADY_PROCESSED; diff --git a/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java index 9f54ca0f57..259a834874 100644 --- a/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java +++ b/src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java @@ -15,6 +15,7 @@ package com.google.devtools.build.skyframe; import com.google.common.collect.ImmutableList; import java.util.function.Supplier; +import javax.annotation.Nullable; /** * An {@link EvaluationProgressReceiver} that delegates to a bunch of other @@ -63,10 +64,11 @@ public class CompoundEvaluationProgressReceiver implements EvaluationProgressRec @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { for (EvaluationProgressReceiver receiver : receivers) { - receiver.evaluated(skyKey, evaluationSuccessState, state); + receiver.evaluated(skyKey, value, evaluationSuccessState, state); } } } diff --git a/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java b/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java index 820fb51cfe..a8ad00cecd 100644 --- a/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java +++ b/src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java @@ -108,10 +108,11 @@ public class DirtyTrackingProgressReceiver implements EvaluationProgressReceiver @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { if (progressReceiver != null) { - progressReceiver.evaluated(skyKey, evaluationSuccessState, state); + progressReceiver.evaluated(skyKey, value, evaluationSuccessState, state); } // This key was either built or marked clean, so we can remove it from both the dirty and 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 d93812b139..09aa231364 100644 --- a/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java +++ b/src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java @@ -15,6 +15,7 @@ package com.google.devtools.build.skyframe; import com.google.devtools.build.lib.concurrent.ThreadSafety; import java.util.function.Supplier; +import javax.annotation.Nullable; /** Receiver for various stages of the lifetime of a skyframe node evaluation. */ @ThreadSafety.ThreadSafe @@ -119,9 +120,13 @@ public interface EvaluationProgressReceiver { * * <p>If the value builder threw an error when building this node, then {@code * valueSupplier.get()} evaluates to null. + * + * @param value The sky value. Only available if just evaluated, eg. on success *and* <code> + * state == EvalutionState.BUILT</code> */ void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state); @@ -146,6 +151,7 @@ public interface EvaluationProgressReceiver { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) {} } diff --git a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java index 67b7176193..638a7615ff 100644 --- a/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java +++ b/src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java @@ -558,14 +558,17 @@ class SkyFunctionEnvironment extends AbstractSkyFunctionEnvironment { // above, its version stayed below this update's version, so its value remains the same. // We use a SkyValueSupplier here because it keeps a reference to the entry, allowing for // the receiver to be confident that the entry is readily accessible in memory. + EvaluationState evaluationState = + valueVersion.equals(evaluatorContext.getGraphVersion()) + ? EvaluationState.BUILT + : EvaluationState.CLEAN; evaluatorContext .getProgressReceiver() .evaluated( skyKey, + evaluationState == EvaluationState.BUILT ? value : null, new EvaluationSuccessStateSupplier(primaryEntry), - valueVersion.equals(evaluatorContext.getGraphVersion()) - ? EvaluationState.BUILT - : EvaluationState.CLEAN); + evaluationState); evaluatorContext.signalValuesAndEnqueueIfReady( skyKey, reverseDeps, valueVersion, enqueueParents); diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java index fbb64fee80..488c9378d0 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java @@ -348,6 +348,7 @@ public final class RecursiveFilesystemTraversalFunctionTest extends FoundationTe @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { if (evaluationSuccessState.get().succeeded()) { diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java index 3bd08d38ec..3060a08d3e 100644 --- a/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java +++ b/src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java @@ -42,6 +42,7 @@ import com.google.devtools.build.skyframe.EvaluationProgressReceiver; import com.google.devtools.build.skyframe.EvaluationProgressReceiver.EvaluationState; import com.google.devtools.build.skyframe.SkyFunction.Environment; import com.google.devtools.build.skyframe.SkyKey; +import com.google.devtools.build.skyframe.SkyValue; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; @@ -165,6 +166,7 @@ public class SkyframeAwareActionTest extends TimestampBuilderTestCase { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { evaluated.add(new EvaluatedEntry(skyKey, evaluationSuccessState.get(), state)); diff --git a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java index 2be4f1b477..0f6090d47c 100644 --- a/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java +++ b/src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java @@ -4337,6 +4337,7 @@ public class MemoizingEvaluatorTest { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { evaluated.add(skyKey); @@ -4475,6 +4476,7 @@ public class MemoizingEvaluatorTest { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { evaluated.add(skyKey); 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 c702bae0bd..6c1e86633d 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,7 @@ public class ParallelEvaluatorTest { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { receivedValues.add(skyKey); @@ -1921,6 +1922,7 @@ public class ParallelEvaluatorTest { @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { evaluatedValues.add(skyKey); diff --git a/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java b/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java index 627460c555..fff5193eb1 100644 --- a/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java +++ b/src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java @@ -17,6 +17,7 @@ import com.google.common.base.Preconditions; import com.google.common.collect.Sets; import java.util.Set; import java.util.function.Supplier; +import javax.annotation.Nullable; /** * A testing utility to keep track of evaluation. @@ -52,6 +53,7 @@ public class TrackingProgressReceiver @Override public void evaluated( SkyKey skyKey, + @Nullable SkyValue value, Supplier<EvaluationSuccessState> evaluationSuccessState, EvaluationState state) { evaluated.add(skyKey); |