Add shared value codec for ConfiguredTargetKey.
PiperOrigin-RevId: 663235289
Change-Id: Ia5577dc22e5973a5afee78c48058f520f0e1b6c8
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
index e51e03b..a98d800 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKey.java
@@ -337,9 +337,56 @@
return key.getOptions().checksum();
}
+ public static ConfiguredTargetKeyValueSharingCodec valueSharingCodec() {
+ return ConfiguredTargetKeyValueSharingCodec.INSTANCE;
+ }
+
+ // TODO: b/359437873 - generate with @AutoCodec.
+ private static class ConfiguredTargetKeyValueSharingCodec
+ extends DeferredObjectCodec<ConfiguredTargetKey> {
+
+ private static final ConfiguredTargetKeyValueSharingCodec INSTANCE =
+ new ConfiguredTargetKeyValueSharingCodec();
+
+ @Override
+ public boolean autoRegister() {
+ return false;
+ }
+
+ @Override
+ public Class<ConfiguredTargetKey> getEncodedClass() {
+ return ConfiguredTargetKey.class;
+ }
+
+ @Override
+ public void serialize(
+ SerializationContext context, ConfiguredTargetKey key, CodedOutputStream codedOut)
+ throws SerializationException, IOException {
+ context.putSharedValue(
+ key, /* distinguisher= */ null, ConfiguredTargetKeyCodec.INSTANCE, codedOut);
+ }
+
+ @Override
+ public DeferredValue<ConfiguredTargetKey> deserializeDeferred(
+ AsyncDeserializationContext context, CodedInputStream codedIn)
+ throws SerializationException, IOException {
+ SimpleDeferredValue<ConfiguredTargetKey> value = SimpleDeferredValue.create();
+ context.getSharedValue(
+ codedIn,
+ /* distinguisher= */ null,
+ ConfiguredTargetKeyCodec.INSTANCE,
+ value,
+ SimpleDeferredValue::set);
+ return value;
+ }
+ }
+
/** Codec for all {@link ConfiguredTargetKey} subtypes. */
@Keep
private static class ConfiguredTargetKeyCodec extends DeferredObjectCodec<ConfiguredTargetKey> {
+
+ private static final ConfiguredTargetKeyCodec INSTANCE = new ConfiguredTargetKeyCodec();
+
@Override
public Class<ConfiguredTargetKey> getEncodedClass() {
return ConfiguredTargetKey.class;
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
index 0913387..beba5f6 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/BUILD
@@ -48,6 +48,7 @@
"//src/main/java/com/google/devtools/build/lib/analysis:blaze_directories",
"//src/main/java/com/google/devtools/build/lib/cmdline",
"//src/main/java/com/google/devtools/build/lib/collect/nestedset",
+ "//src/main/java/com/google/devtools/build/lib/skyframe:configured_target_key",
"//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java
index 217cafd..03d0421 100644
--- a/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java
+++ b/src/main/java/com/google/devtools/build/lib/skyframe/serialization/SerializationModule.java
@@ -23,6 +23,7 @@
import com.google.devtools.build.lib.runtime.BlazeModule;
import com.google.devtools.build.lib.runtime.BlazeRuntime;
import com.google.devtools.build.lib.runtime.WorkspaceBuilder;
+import com.google.devtools.build.lib.skyframe.ConfiguredTargetKey;
import java.util.function.Supplier;
/** A {@link BlazeModule} to store Skyframe serialization lifecycle hooks. */
@@ -68,7 +69,8 @@
.add(ArrayCodec.forComponentType(Artifact.class))
.add(new DeferredNestedSetCodec())
.add(Label.valueSharingCodec())
- .add(PackageIdentifier.valueSharingCodec());
+ .add(PackageIdentifier.valueSharingCodec())
+ .add(ConfiguredTargetKey.valueSharingCodec());
builder =
CommonSerializationConstants.addStarlarkFunctionality(
builder, runtime.getRuleClassProvider());
diff --git a/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java b/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java
index 1201693..e6ac988 100644
--- a/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java
+++ b/src/test/java/com/google/devtools/build/lib/skyframe/ConfiguredTargetKeyTest.java
@@ -18,6 +18,7 @@
import com.google.devtools.build.lib.analysis.util.BuildViewTestCase;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.skyframe.serialization.testutils.SerializationTester;
+import com.google.testing.junit.testparameterinjector.TestParameter;
import com.google.testing.junit.testparameterinjector.TestParameterInjector;
import org.junit.Test;
import org.junit.runner.RunWith;
@@ -25,7 +26,7 @@
@RunWith(TestParameterInjector.class)
public final class ConfiguredTargetKeyTest extends BuildViewTestCase {
@Test
- public void testCodec() throws Exception {
+ public void testCodec(@TestParameter boolean useSharedValues) throws Exception {
var nullConfigKey =
createKey(
/* useNullConfig= */ true,
@@ -52,14 +53,22 @@
/* isToolchainKey= */ true,
/* shouldApplyRuleTransition= */ false);
- new SerializationTester(
- nullConfigKey,
- keyWithConfig,
- keyWithFinalConfig,
- toolchainKey,
- toolchainKeyWithFinalConfig)
- .addDependency(OptionsChecksumCache.class, new MapBackedChecksumCache())
- .runTests();
+ var tester =
+ new SerializationTester(
+ nullConfigKey,
+ keyWithConfig,
+ keyWithFinalConfig,
+ toolchainKey,
+ toolchainKeyWithFinalConfig)
+ .addDependency(OptionsChecksumCache.class, new MapBackedChecksumCache());
+
+ if (useSharedValues) {
+ tester
+ .addCodec(ConfiguredTargetKey.valueSharingCodec())
+ .makeMemoizingAndAllowFutureBlocking(true);
+ }
+
+ tester.runTests();
}
private ConfiguredTargetKey createKey(