blob: 3b6d5164b8d6c25890adb967248ad21acedb22ed [file] [log] [blame]
// Copyright 2022 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.skyframe;
import static com.google.devtools.build.lib.skyframe.ArtifactConflictFinder.NUM_JOBS;
import com.google.devtools.build.lib.actions.ActionLookupKey;
import com.google.devtools.build.lib.actions.ActionLookupValue;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.ConfiguredTargetValue;
import com.google.devtools.build.lib.analysis.configuredtargets.InputFileConfiguredTarget;
import com.google.devtools.build.lib.analysis.configuredtargets.OutputFileConfiguredTarget;
import com.google.devtools.build.lib.bugreport.BugReport;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
import com.google.devtools.build.lib.concurrent.Sharder;
import com.google.devtools.build.skyframe.SkyValue;
import java.util.Objects;
/** Represents the traversal of the ActionLookupValues in a build. */
public class ActionLookupValuesTraversal {
// Some metrics indicate this is a rough average # of ALVs in a build.
private final Sharder<ActionLookupValue> actionLookupValueShards =
new Sharder<>(NUM_JOBS, /* expectedTotalSize= */ 200_000);
// Metrics.
private int configuredObjectCount = 0;
private int configuredTargetCount = 0;
private int actionCount = 0;
private int actionCountNotIncludingAspects = 0;
private int inputFileConfiguredTargetCount = 0;
private int outputFileConfiguredTargetCount = 0;
private int otherConfiguredTargetCount = 0;
public ActionLookupValuesTraversal() {}
void accumulate(ActionLookupKey key, SkyValue value) {
boolean isConfiguredTarget = value instanceof ConfiguredTargetValue;
boolean isActionLookupValue = value instanceof ActionLookupValue;
if (!isConfiguredTarget && !isActionLookupValue) {
BugReport.sendBugReport(
new IllegalStateException(
String.format(
"Should only be called with ConfiguredTargetValue or ActionLookupValue: %s %s"
+ " %s",
value.getClass(), key, value)));
return;
}
if (isConfiguredTarget
&& !Objects.equals(
key.getConfigurationKey(),
((ConfiguredTargetValue) value).getConfiguredTarget().getConfigurationKey())) {
// The configuration of the key doesn't match the configuration of the value. This means that
// the ConfiguredTargetValue is delegated from a different key. This ConfiguredTargetValue
// will show up again under its own key. Avoids double counting by skipping accumulation.
return;
}
configuredObjectCount++;
if (isConfiguredTarget) {
configuredTargetCount++;
}
if (isActionLookupValue) {
ActionLookupValue alv = (ActionLookupValue) value;
int numActions = alv.getNumActions();
actionCount += numActions;
if (isConfiguredTarget) {
actionCountNotIncludingAspects += numActions;
}
actionLookupValueShards.add(alv);
return;
}
if (!(value instanceof NonRuleConfiguredTargetValue)) {
BugReport.sendBugReport(
new IllegalStateException(
String.format("Unexpected value type: %s %s %s", value.getClass(), key, value)));
return;
}
ConfiguredTarget configuredTarget =
((NonRuleConfiguredTargetValue) value).getConfiguredTarget();
if (configuredTarget instanceof InputFileConfiguredTarget) {
inputFileConfiguredTargetCount++;
} else if (configuredTarget instanceof OutputFileConfiguredTarget) {
outputFileConfiguredTargetCount++;
} else {
otherConfiguredTargetCount++;
}
}
Sharder<ActionLookupValue> getActionLookupValueShards() {
return actionLookupValueShards;
}
int getActionCount() {
return actionCount;
}
BuildEventStreamProtos.BuildMetrics.BuildGraphMetrics.Builder getMetrics() {
return BuildEventStreamProtos.BuildMetrics.BuildGraphMetrics.newBuilder()
.setActionLookupValueCount(configuredObjectCount)
.setActionLookupValueCountNotIncludingAspects(configuredTargetCount)
.setActionCount(actionCount)
.setActionCountNotIncludingAspects(actionCountNotIncludingAspects)
.setInputFileConfiguredTargetCount(inputFileConfiguredTargetCount)
.setOutputFileConfiguredTargetCount(outputFileConfiguredTargetCount)
.setOtherConfiguredTargetCount(otherConfiguredTargetCount);
}
}