aboutsummaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorGravatar tomlu <tomlu@google.com>2018-06-19 15:07:26 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-06-19 15:09:17 -0700
commita0e8aae4b30a23d6a3069c343a47cd56b5ed3809 (patch)
tree255a02dc61f029f3495ca7bbee4f54bc1a6fa40c
parentaf545684f4f9c2697951d291d00ae2106ff65041 (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
-rw-r--r--src/main/java/com/google/devtools/build/lib/BUILD2
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/AnalysisPhaseCompleteEvent.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/BuildView.java5
-rw-r--r--src/main/java/com/google/devtools/build/lib/bazel/Bazel.java1
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildeventstream/BuildEventId.java8
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildeventstream/proto/build_event_stream.proto17
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/BuildTool.java16
-rw-r--r--src/main/java/com/google/devtools/build/lib/buildtool/ExecutionProgressReceiver.java3
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/BUILD20
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/BuildMetricsEvent.java55
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/MetricsCollector.java52
-rw-r--r--src/main/java/com/google/devtools/build/lib/metrics/MetricsModule.java32
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeBuildView.java22
-rw-r--r--src/main/java/com/google/devtools/build/lib/skyframe/SkyframeExecutor.java7
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/AbstractExceptionalParallelEvaluator.java9
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/AbstractParallelEvaluator.java3
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/CompoundEvaluationProgressReceiver.java4
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/DirtyTrackingProgressReceiver.java3
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/EvaluationProgressReceiver.java6
-rw-r--r--src/main/java/com/google/devtools/build/skyframe/SkyFunctionEnvironment.java9
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/RecursiveFilesystemTraversalFunctionTest.java1
-rw-r--r--src/test/java/com/google/devtools/build/lib/skyframe/SkyframeAwareActionTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/skyframe/MemoizingEvaluatorTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/skyframe/ParallelEvaluatorTest.java2
-rw-r--r--src/test/java/com/google/devtools/build/skyframe/TrackingProgressReceiver.java2
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);