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(