[aquery] Fix the case with duplicated Target entries.
We're using RuleConfiguredTarget as the key to the cache for analysis.proto's
Target. When the same target is configured in 2 configurations in a build, we'd
have 2 distinct RuleConfiguredTargets and as a result 2 separate Targets in the
cache, which shouldn't be the case.
RELNOTES: None.
PiperOrigin-RevId: 296162528
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
index 03eada4..da21422 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/ActionGraphDump.java
@@ -40,6 +40,7 @@
import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
import com.google.devtools.build.lib.skyframe.AspectValue;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetValue;
+import com.google.devtools.build.lib.util.Pair;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@@ -60,7 +61,7 @@
private final KnownConfigurations knownConfigurations;
private final KnownNestedSets knownNestedSets;
private final KnownAspectDescriptors knownAspectDescriptors;
- private final KnownRuleConfiguredTargets knownRuleConfiguredTargets;
+ private final KnownTargets knownTargets;
private final AqueryActionFilter actionFilters;
private final boolean includeActionCmdLine;
private final boolean includeArtifacts;
@@ -108,8 +109,7 @@
knownConfigurations = new KnownConfigurations(actionGraphBuilder);
knownNestedSets = new KnownNestedSets(actionGraphBuilder, knownArtifacts);
knownAspectDescriptors = new KnownAspectDescriptors(actionGraphBuilder);
- knownRuleConfiguredTargets = new KnownRuleConfiguredTargets(actionGraphBuilder,
- knownRuleClassStrings);
+ knownTargets = new KnownTargets(actionGraphBuilder, knownRuleClassStrings);
}
public ActionKeyContext getActionKeyContext() {
@@ -145,11 +145,14 @@
}
Preconditions.checkState(configuredTarget instanceof RuleConfiguredTarget);
- RuleConfiguredTarget ruleConfiguredTarget = (RuleConfiguredTarget) configuredTarget;
+ Pair<String, String> targetIdentifier =
+ new Pair<>(
+ configuredTarget.getLabel().toString(),
+ ((RuleConfiguredTarget) configuredTarget).getRuleClassString());
AnalysisProtos.Action.Builder actionBuilder =
AnalysisProtos.Action.newBuilder()
.setMnemonic(action.getMnemonic())
- .setTargetId(knownRuleConfiguredTargets.dataToId(ruleConfiguredTarget));
+ .setTargetId(knownTargets.dataToId(targetIdentifier));
if (action instanceof ActionExecutionMetadata) {
ActionExecutionMetadata actionExecutionMetadata = (ActionExecutionMetadata) action;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownRuleConfiguredTargets.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownTargets.java
similarity index 69%
rename from src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownRuleConfiguredTargets.java
rename to src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownTargets.java
index 12005f5..ccce75e 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownRuleConfiguredTargets.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownTargets.java
@@ -15,18 +15,19 @@
import com.google.devtools.build.lib.analysis.AnalysisProtos;
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.util.Pair;
/**
* Cache for RuleConfiguredTargets in the action graph.
+ *
+ * <p>The cache maps a target identifier, which is a {@code Pair<String, String>} of
+ * (label, rule class string).
*/
-public class KnownRuleConfiguredTargets
- extends BaseCache<RuleConfiguredTarget, AnalysisProtos.Target> {
+public class KnownTargets extends BaseCache<Pair<String, String>, AnalysisProtos.Target> {
private final KnownRuleClassStrings knownRuleClassStrings;
- KnownRuleConfiguredTargets(
+ KnownTargets(
ActionGraphContainer.Builder actionGraphBuilder,
KnownRuleClassStrings knownRuleClassStrings) {
super(actionGraphBuilder);
@@ -34,12 +35,11 @@
}
@Override
- AnalysisProtos.Target createProto(RuleConfiguredTarget ruleConfiguredTarget, String id) {
- Label label = ruleConfiguredTarget.getLabel();
- String ruleClassString = ruleConfiguredTarget.getRuleClassString();
- AnalysisProtos.Target.Builder targetBuilder = AnalysisProtos.Target.newBuilder()
- .setId(id)
- .setLabel(label.toString());
+ AnalysisProtos.Target createProto(Pair<String, String> targetIdentifier, String id) {
+ String labelString = targetIdentifier.getFirst();
+ String ruleClassString = targetIdentifier.getSecond();
+ AnalysisProtos.Target.Builder targetBuilder =
+ AnalysisProtos.Target.newBuilder().setId(id).setLabel(labelString);
if (ruleClassString != null) {
targetBuilder.setRuleClassId(knownRuleClassStrings.dataToId(ruleClassString));
}
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java
index 0301bf6..a787f89 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/ActionGraphDump.java
@@ -39,6 +39,7 @@
import com.google.devtools.build.lib.rules.AliasConfiguredTarget;
import com.google.devtools.build.lib.skyframe.AspectValue;
import com.google.devtools.build.lib.skyframe.ConfiguredTargetValue;
+import com.google.devtools.build.lib.util.Pair;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
@@ -59,7 +60,7 @@
private final KnownConfigurations knownConfigurations;
private final KnownNestedSets knownNestedSets;
private final KnownAspectDescriptors knownAspectDescriptors;
- private final KnownRuleConfiguredTargets knownRuleConfiguredTargets;
+ private final KnownTargets knownTargets;
private final AqueryActionFilter actionFilters;
private final boolean includeActionCmdLine;
private final boolean includeArtifacts;
@@ -102,8 +103,7 @@
knownConfigurations = new KnownConfigurations(aqueryOutputHandler);
knownNestedSets = new KnownNestedSets(aqueryOutputHandler, knownArtifacts);
knownAspectDescriptors = new KnownAspectDescriptors(aqueryOutputHandler);
- knownRuleConfiguredTargets =
- new KnownRuleConfiguredTargets(aqueryOutputHandler, knownRuleClassStrings);
+ knownTargets = new KnownTargets(aqueryOutputHandler, knownRuleClassStrings);
}
public ActionKeyContext getActionKeyContext() {
@@ -139,12 +139,14 @@
}
Preconditions.checkState(configuredTarget instanceof RuleConfiguredTarget);
- RuleConfiguredTarget ruleConfiguredTarget = (RuleConfiguredTarget) configuredTarget;
+ Pair<String, String> targetIdentifier =
+ new Pair<>(
+ configuredTarget.getLabel().toString(),
+ ((RuleConfiguredTarget) configuredTarget).getRuleClassString());
AnalysisProtosV2.Action.Builder actionBuilder =
AnalysisProtosV2.Action.newBuilder()
.setMnemonic(action.getMnemonic())
- .setTargetId(
- knownRuleConfiguredTargets.dataToIdAndStreamOutputProto(ruleConfiguredTarget));
+ .setTargetId(knownTargets.dataToIdAndStreamOutputProto(targetIdentifier));
if (action instanceof ActionExecutionMetadata) {
ActionExecutionMetadata actionExecutionMetadata = (ActionExecutionMetadata) action;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/KnownRuleConfiguredTargets.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/KnownTargets.java
similarity index 71%
rename from src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/KnownRuleConfiguredTargets.java
rename to src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/KnownTargets.java
index 14675c2..a434e59 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/KnownRuleConfiguredTargets.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/v2/KnownTargets.java
@@ -14,26 +14,30 @@
package com.google.devtools.build.lib.skyframe.actiongraph.v2;
import com.google.devtools.build.lib.analysis.AnalysisProtosV2.Target;
-import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
-import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.util.Pair;
import java.io.IOException;
-/** Cache for RuleConfiguredTargets in the action graph. */
-public class KnownRuleConfiguredTargets extends BaseCache<RuleConfiguredTarget, Target> {
+/**
+ * Cache for RuleConfiguredTargets in the action graph.
+ *
+ * <p>The cache maps a target identifier, which is a {@code Pair<String, String>} of
+ * (label, rule class string).
+ * */
+public class KnownTargets extends BaseCache<Pair<String, String>, Target> {
private final KnownRuleClassStrings knownRuleClassStrings;
- KnownRuleConfiguredTargets(
+ KnownTargets(
AqueryOutputHandler aqueryOutputHandler, KnownRuleClassStrings knownRuleClassStrings) {
super(aqueryOutputHandler);
this.knownRuleClassStrings = knownRuleClassStrings;
}
@Override
- Target createProto(RuleConfiguredTarget ruleConfiguredTarget, int id) throws IOException {
- Label label = ruleConfiguredTarget.getLabel();
- String ruleClassString = ruleConfiguredTarget.getRuleClassString();
- Target.Builder targetBuilder = Target.newBuilder().setId(id).setLabel(label.toString());
+ Target createProto(Pair<String, String> targetIdentifier, int id) throws IOException {
+ String labelString = targetIdentifier.getFirst();
+ String ruleClassString = targetIdentifier.getSecond();
+ Target.Builder targetBuilder = Target.newBuilder().setId(id).setLabel(labelString);
if (ruleClassString != null) {
targetBuilder.setRuleClassId(
knownRuleClassStrings.dataToIdAndStreamOutputProto(ruleClassString));