ActionOwner references only BuildEvent instead of full BuildConfiguration
This reduces the size of its serialized representation.
PiperOrigin-RevId: 188597127
diff --git a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
index 77c67a81..eaad2df 100644
--- a/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
+++ b/src/main/java/com/google/devtools/build/lib/actions/ActionOwner.java
@@ -56,7 +56,7 @@
@Nullable String mnemonic,
@Nullable String targetKind,
String configurationChecksum,
- @Nullable BuildConfigurationInterface configuration,
+ @Nullable BuildConfigurationEvent configuration,
@Nullable String additionalProgressInfo,
@Nullable PlatformInfo executionPlatform) {
return new AutoValue_ActionOwner(
@@ -94,11 +94,11 @@
public abstract String getConfigurationChecksum();
/**
- * Return the configuration of the action owner, if any, as it should be reported in the build
- * event protocol.
+ * Return the {@link BuildConfigurationEvent} associated with the action owner, if any, as it
+ * should be reported in the build event protocol.
*/
@Nullable
- public abstract BuildConfigurationInterface getConfiguration();
+ public abstract BuildConfigurationEvent getConfiguration();
/** Returns the target kind (rule class name) for this ActionOwner, if any; null otherwise. */
@Nullable
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java
new file mode 100644
index 0000000..96fd9cb
--- /dev/null
+++ b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationEvent.java
@@ -0,0 +1,70 @@
+// 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.actions;
+
+import com.google.common.collect.ImmutableList;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventConverters;
+import com.google.devtools.build.lib.buildeventstream.BuildEventId;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
+import java.util.Collection;
+import java.util.Objects;
+
+/**
+ * Encapsulation of {@link BuildEvent} info associated with a {@link
+ * com.google.devtools.build.lib.analysis.config.BuildConfiguration}.
+ */
+@AutoCodec
+public class BuildConfigurationEvent implements BuildEvent {
+
+ private final BuildEventId eventId;
+ private final BuildEventStreamProtos.BuildEvent eventProto;
+
+ public BuildConfigurationEvent(
+ BuildEventId eventId, BuildEventStreamProtos.BuildEvent eventProto) {
+ this.eventId = eventId;
+ this.eventProto = eventProto;
+ }
+
+ @Override
+ public BuildEventStreamProtos.BuildEvent asStreamProto(BuildEventConverters unusedConverters) {
+ return eventProto;
+ }
+
+ @Override
+ public BuildEventId getEventId() {
+ return eventId;
+ }
+
+ @Override
+ public Collection<BuildEventId> getChildrenEvents() {
+ return ImmutableList.of();
+ }
+
+ @Override
+ public boolean equals(Object other) {
+ if (!(other instanceof BuildConfigurationEvent)) {
+ return false;
+ }
+ BuildConfigurationEvent that = (BuildConfigurationEvent) other;
+ return Objects.equals(eventId, that.eventId) && Objects.equals(eventProto, that.eventProto);
+ }
+
+ @Override
+ public int hashCode() {
+ return Objects.hash(eventId, eventProto);
+ }
+}
diff --git a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java b/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java
deleted file mode 100644
index f033754..0000000
--- a/src/main/java/com/google/devtools/build/lib/actions/BuildConfigurationInterface.java
+++ /dev/null
@@ -1,25 +0,0 @@
-// 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.actions;
-
-import com.google.devtools.build.lib.buildeventstream.BuildEvent;
-
-/**
- * An interface for {@code BuildConfiguration} that only exists so that {@link ActionOwner} can
- * refer to {@code BuildConfiguration}, which is in a dependent package. {@code BuildConfiguration}
- * must be the only implementation of this interface.
- */
-public interface BuildConfigurationInterface extends BuildEvent {
-}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
index 19e0b58..a4671e9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/AspectConfiguredEvent.java
@@ -43,7 +43,7 @@
ImmutableList.Builder<BuildEvent> builder = new ImmutableList.Builder<>();
for (BuildConfiguration config : configurations) {
if (config != null) {
- builder.add(config);
+ builder.add(config.toBuildEvent());
} else {
builder.add(new NullConfiguration());
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
index 316791d..075a0ab 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/RuleContext.java
@@ -483,7 +483,7 @@
configuration.getMnemonic(),
rule.getTargetKind(),
configuration.checksum(),
- configuration,
+ configuration.toBuildEvent(),
configuration.isHostConfiguration() ? HOST_CONFIGURATION_PROGRESS_TAG : null,
executionPlatform);
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
index 5c36d85..eae32b2 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetCompleteEvent.java
@@ -254,7 +254,7 @@
public Collection<BuildEvent> getConfigurations() {
BuildConfiguration configuration = target.getConfiguration();
if (configuration != null) {
- return ImmutableList.of(target.getConfiguration());
+ return ImmutableList.of(target.getConfiguration().toBuildEvent());
} else {
return ImmutableList.<BuildEvent>of();
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java b/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
index db6bea2..daa08d9 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/TargetConfiguredEvent.java
@@ -45,7 +45,7 @@
ImmutableList.Builder<BuildEvent> builder = new ImmutableList.Builder<>();
for (BuildConfiguration config : configurations) {
if (config != null) {
- builder.add(config);
+ builder.add(config.toBuildEvent());
} else {
builder.add(new NullConfiguration());
}
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
index ce0a75a..dc95254 100644
--- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
+++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildConfiguration.java
@@ -18,6 +18,7 @@
import com.google.common.base.Joiner;
import com.google.common.base.Predicate;
import com.google.common.base.Splitter;
+import com.google.common.base.Suppliers;
import com.google.common.base.Verify;
import com.google.common.collect.ArrayListMultimap;
import com.google.common.collect.ClassToInstanceMap;
@@ -34,16 +35,14 @@
import com.google.common.collect.MutableClassToInstanceMap;
import com.google.devtools.build.lib.actions.ActionEnvironment;
import com.google.devtools.build.lib.actions.ArtifactRoot;
-import com.google.devtools.build.lib.actions.BuildConfigurationInterface;
+import com.google.devtools.build.lib.actions.BuildConfigurationEvent;
import com.google.devtools.build.lib.analysis.BlazeDirectories;
import com.google.devtools.build.lib.analysis.ConfiguredRuleClassProvider;
import com.google.devtools.build.lib.analysis.actions.FileWriteAction;
import com.google.devtools.build.lib.analysis.config.transitions.ComposingPatchTransition;
import com.google.devtools.build.lib.analysis.config.transitions.PatchTransition;
-import com.google.devtools.build.lib.buildeventstream.BuildEventConverters;
import com.google.devtools.build.lib.buildeventstream.BuildEventId;
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
-import com.google.devtools.build.lib.buildeventstream.GenericBuildEvent;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.cmdline.LabelSyntaxException;
import com.google.devtools.build.lib.cmdline.RepositoryName;
@@ -71,7 +70,6 @@
import com.google.devtools.common.options.OptionsParsingException;
import com.google.devtools.common.options.TriState;
import java.util.ArrayList;
-import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
import java.util.HashMap;
@@ -82,6 +80,7 @@
import java.util.Objects;
import java.util.Set;
import java.util.TreeMap;
+import java.util.function.Supplier;
import javax.annotation.Nullable;
/**
@@ -113,7 +112,7 @@
// TODO(janakr): If overhead of fragments class names is too high, add constructor that just takes
// fragments and gets names from them.
@AutoCodec
-public class BuildConfiguration implements BuildConfigurationInterface {
+public class BuildConfiguration {
/**
* Sorts fragments by class name. This produces a stable order which, e.g., facilitates consistent
* output from buildMnemonic.
@@ -1180,6 +1179,8 @@
/** Data for introspecting the options used by this configuration. */
private final TransitiveOptionDetails transitiveOptionDetails;
+ private final Supplier<BuildConfigurationEvent> buildEventSupplier;
+
/**
* Returns true if this configuration is semantically equal to the other, with
* the possible exception that the other has fewer fragments.
@@ -1406,6 +1407,7 @@
reservedActionMnemonics.addAll(fragment.getReservedActionMnemonics());
}
this.reservedActionMnemonics = reservedActionMnemonics.build();
+ this.buildEventSupplier = Suppliers.memoize(this::createBuildEvent);
}
/**
@@ -2068,24 +2070,27 @@
return currentTransition;
}
- @Override
public BuildEventId getEventId() {
return BuildEventId.configurationId(checksum());
}
- @Override
- public Collection<BuildEventId> getChildrenEvents() {
- return ImmutableList.of();
+ public BuildConfigurationEvent toBuildEvent() {
+ return buildEventSupplier.get();
}
- @Override
- public BuildEventStreamProtos.BuildEvent asStreamProto(BuildEventConverters converters) {
- BuildEventStreamProtos.Configuration.Builder builder =
- BuildEventStreamProtos.Configuration.newBuilder()
- .setMnemonic(getMnemonic())
- .setPlatformName(getCpu())
- .putAllMakeVariable(getMakeEnvironment())
- .setCpu(getCpu());
- return GenericBuildEvent.protoChaining(this).setConfiguration(builder.build()).build();
+ private BuildConfigurationEvent createBuildEvent() {
+ BuildEventId eventId = getEventId();
+ BuildEventStreamProtos.BuildEvent.Builder builder =
+ BuildEventStreamProtos.BuildEvent.newBuilder();
+ builder
+ .setId(eventId.asStreamProto())
+ .setConfiguration(
+ BuildEventStreamProtos.Configuration.newBuilder()
+ .setMnemonic(getMnemonic())
+ .setPlatformName(getCpu())
+ .putAllMakeVariable(getMakeEnvironment())
+ .setCpu(getCpu())
+ .build());
+ return new BuildConfigurationEvent(eventId, builder.build());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java b/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java
index 991b26e..1859e6d 100644
--- a/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java
+++ b/src/main/java/com/google/devtools/build/lib/bazel/rules/VisibilityErrorEvent.java
@@ -61,6 +61,6 @@
@Override
public Collection<BuildEvent> getConfigurations() {
- return ImmutableList.<BuildEvent>of(configuration);
+ return ImmutableList.<BuildEvent>of(configuration.toBuildEvent());
}
}
diff --git a/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD b/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD
index f56bd27..4817398 100644
--- a/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/buildeventstream/BUILD
@@ -16,6 +16,7 @@
"//src/main/java/com/google/devtools/build/lib/buildeventstream/proto:build_event_stream_java_proto",
"//src/main/java/com/google/devtools/build/lib/causes",
"//src/main/java/com/google/devtools/build/lib/cmdline",
+ "//src/main/java/com/google/devtools/build/lib/skyframe/serialization/autocodec",
"//src/main/java/com/google/devtools/build/lib/vfs",
"//third_party:guava",
"//third_party:jsr305",
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 e0c5b78..feab9ba 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
@@ -18,6 +18,7 @@
import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos.BuildEventId.ConfigurationId;
import com.google.devtools.build.lib.causes.Cause;
import com.google.devtools.build.lib.cmdline.Label;
+import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec;
import com.google.devtools.build.lib.vfs.Path;
import com.google.protobuf.TextFormat;
import java.io.Serializable;
@@ -34,11 +35,13 @@
* identifiers that do not accidentally coincide is by providing a target or a target pattern;
* therefore, those (if provided) are made specially visible.
*/
+@AutoCodec
@Immutable
public final class BuildEventId implements Serializable {
private final BuildEventStreamProtos.BuildEventId protoid;
- private BuildEventId(BuildEventStreamProtos.BuildEventId protoid) {
+ @AutoCodec.VisibleForSerialization
+ BuildEventId(BuildEventStreamProtos.BuildEventId protoid) {
this.protoid = protoid;
}
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 3a18d41..8c68b26 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
@@ -28,8 +28,8 @@
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer;
import com.google.devtools.build.lib.analysis.ConfiguredTarget;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
import com.google.devtools.build.lib.analysis.configuredtargets.RuleConfiguredTarget;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.NestedSetView;
@@ -103,7 +103,7 @@
// store environment
if (action instanceof SpawnAction) {
SpawnAction spawnAction = (SpawnAction) action;
- // TODO(twerth): This handles the fixed environemnt. We probably want to output the inherited
+ // TODO(twerth): This handles the fixed environment. We probably want to output the inherited
// environment as well.
ImmutableMap<String, String> fixedEnvironment = spawnAction.getEnvironment();
for (Entry<String, String> environmentVariable : fixedEnvironment.entrySet()) {
@@ -122,8 +122,8 @@
ActionOwner actionOwner = action.getOwner();
if (actionOwner != null) {
- BuildConfiguration buildConfiguration = (BuildConfiguration) actionOwner.getConfiguration();
- actionBuilder.setConfigurationId(knownConfigurations.dataToId(buildConfiguration));
+ BuildEvent event = actionOwner.getConfiguration();
+ actionBuilder.setConfigurationId(knownConfigurations.dataToId(event));
// store aspect
for (AspectDescriptor aspectDescriptor : actionOwner.getAspectDescriptors()) {
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownConfigurations.java b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownConfigurations.java
index 71ea0d7..6083d0b 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownConfigurations.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/actiongraph/KnownConfigurations.java
@@ -15,25 +15,25 @@
import com.google.devtools.build.lib.analysis.AnalysisProtos;
import com.google.devtools.build.lib.analysis.AnalysisProtos.ActionGraphContainer.Builder;
-import com.google.devtools.build.lib.analysis.config.BuildConfiguration;
+import com.google.devtools.build.lib.buildeventstream.BuildEvent;
+import com.google.devtools.build.lib.buildeventstream.BuildEventStreamProtos;
-/**
- * Cache for BuildConfigurations in the action graph.
- */
-public class KnownConfigurations
- extends BaseCache<BuildConfiguration, AnalysisProtos.Configuration> {
+/** Cache for BuildConfigurations in the action graph. */
+public class KnownConfigurations extends BaseCache<BuildEvent, AnalysisProtos.Configuration> {
KnownConfigurations(Builder actionGraphBuilder) {
super(actionGraphBuilder);
}
@Override
- AnalysisProtos.Configuration createProto(BuildConfiguration buildConfiguration, String id) {
+ AnalysisProtos.Configuration createProto(BuildEvent config, String id) {
+ BuildEventStreamProtos.Configuration configProto =
+ config.asStreamProto(/*converters=*/ null).getConfiguration();
return AnalysisProtos.Configuration.newBuilder()
- .setMnemonic(buildConfiguration.getMnemonic())
- .setPlatformName(buildConfiguration.getPlatformName())
- .setId(id)
- .build();
+ .setMnemonic(configProto.getMnemonic())
+ .setPlatformName(configProto.getPlatformName())
+ .setId(id)
+ .build();
}
@Override
diff --git a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
index e2447f1..9ff8d76 100644
--- a/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
+++ b/src/test/java/com/google/devtools/build/lib/runtime/BuildEventStreamerTest.java
@@ -650,9 +650,9 @@
BuildConfiguration.Options.class)),
"workspace");
BuildEvent firstWithConfiguration =
- new GenericConfigurationEvent(testId("first"), configuration);
+ new GenericConfigurationEvent(testId("first"), configuration.toBuildEvent());
BuildEvent secondWithConfiguration =
- new GenericConfigurationEvent(testId("second"), configuration);
+ new GenericConfigurationEvent(testId("second"), configuration.toBuildEvent());
streamer.buildEvent(startEvent);
streamer.buildEvent(firstWithConfiguration);
@@ -663,7 +663,7 @@
assertThat(allEventsSeen).hasSize(7);
assertThat(allEventsSeen.get(0).getEventId()).isEqualTo(startEvent.getEventId());
assertThat(allEventsSeen.get(1).getEventId()).isEqualTo(ProgressEvent.INITIAL_PROGRESS_UPDATE);
- assertThat(allEventsSeen.get(2)).isEqualTo(configuration);
+ assertThat(allEventsSeen.get(2)).isEqualTo(configuration.toBuildEvent());
assertThat(allEventsSeen.get(3).getEventId()).isEqualTo(BuildEventId.progressId(1));
assertThat(allEventsSeen.get(4)).isEqualTo(firstWithConfiguration);
assertThat(allEventsSeen.get(5).getEventId()).isEqualTo(BuildEventId.progressId(2));