diff options
author | 2018-05-14 12:06:36 -0700 | |
---|---|---|
committer | 2018-05-14 12:08:36 -0700 | |
commit | 5217712b50674f283b36192b4b67c173aecb2172 (patch) | |
tree | 4200a56b4664646860958c6cc258782a7ef05ff5 /src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java | |
parent | 9980c7b98e880433f9be21b25eedf7dd6f4ca234 (diff) |
Pull caching up to BuildConfigurationValue$Key$Codec. Almost all BuildOptions$DiffForReconstruction serializations are reached in this way, so we get better efficiency. Also, it was already a custom codec, so less new handrolling.
Also use serialization framework for FragmentClassSet, instead of doing serialization directly. Default FragmentClassSet should be a constant, so it will serialize down to a byte or three. Future changes can make all the classes constants as well, if we're getting misses on them.
PiperOrigin-RevId: 196546279
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java')
-rw-r--r-- | src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java | 89 |
1 files changed, 1 insertions, 88 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java index 87c4244a13..a91649bf30 100644 --- a/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java +++ b/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java @@ -27,10 +27,6 @@ import com.google.common.collect.Multimap; import com.google.common.collect.Sets; import com.google.devtools.build.lib.cmdline.Label; import com.google.devtools.build.lib.runtime.proto.InvocationPolicyOuterClass.InvocationPolicy; -import com.google.devtools.build.lib.skyframe.serialization.DeserializationContext; -import com.google.devtools.build.lib.skyframe.serialization.ObjectCodec; -import com.google.devtools.build.lib.skyframe.serialization.SerializationContext; -import com.google.devtools.build.lib.skyframe.serialization.SerializationException; import com.google.devtools.build.lib.skyframe.serialization.autocodec.AutoCodec; import com.google.devtools.build.lib.util.Fingerprint; import com.google.devtools.build.lib.util.OrderedSetMultimap; @@ -40,10 +36,6 @@ import com.google.devtools.common.options.OptionsBase; import com.google.devtools.common.options.OptionsClassProvider; import com.google.devtools.common.options.OptionsParser; import com.google.devtools.common.options.OptionsParsingException; -import com.google.protobuf.CodedInputStream; -import com.google.protobuf.CodedOutputStream; -import java.io.ByteArrayOutputStream; -import java.io.IOException; import java.io.Serializable; import java.util.ArrayList; import java.util.Arrays; @@ -51,7 +43,6 @@ import java.util.Collection; import java.util.Comparator; import java.util.HashMap; import java.util.HashSet; -import java.util.IdentityHashMap; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -552,6 +543,7 @@ public final class BuildOptions implements Cloneable, Serializable { * another: the full fragments of the second one, the fragment classes of the first that should be * omitted, and the values of any fields that should be changed. */ + @AutoCodec public static class OptionsDiffForReconstruction { private final Map<Class<? extends FragmentOptions>, Map<String, Object>> differingOptions; private final ImmutableSet<Class<? extends FragmentOptions>> extraFirstFragmentClasses; @@ -635,83 +627,4 @@ public final class BuildOptions implements Cloneable, Serializable { return 31 * Arrays.hashCode(baseFingerprint) + checksum.hashCode(); } } - - /** - * Hand-rolled Codec so we can cache the byte representation of a {@link - * BuildOptions.OptionsDiffForReconstruction} object because serialization is expensive. - */ - @VisibleForTesting - static class OptionsDiffForReconstructionCodec - implements ObjectCodec<OptionsDiffForReconstruction> { - - @Override - public void serialize( - SerializationContext context, - BuildOptions.OptionsDiffForReconstruction input, - CodedOutputStream codedOut) - throws SerializationException, IOException { - context = context.getNewNonMemoizingContext(); - // We get this cache from our context because there can be different ObjectCodecRegistry's for - // SkyKeys and SkyValues. - @SuppressWarnings("unchecked") - IdentityHashMap<OptionsDiffForReconstruction, byte[]> cache = - context.getDependency(IdentityHashMap.class); - if (cache.containsKey(input)) { - byte[] rawBytes = cache.get(input); - codedOut.writeInt32NoTag(rawBytes.length); - codedOut.writeRawBytes(cache.get(input)); - } else { - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); - CodedOutputStream codedOutputStream = CodedOutputStream.newInstance(byteArrayOutputStream); - context.serialize(input.differingOptions, codedOutputStream); - context.serialize(input.extraFirstFragmentClasses, codedOutputStream); - context.serialize(input.extraSecondFragments, codedOutputStream); - if (input.baseFingerprint != null) { - codedOutputStream.writeBoolNoTag(true); - codedOutputStream.writeInt32NoTag(input.baseFingerprint.length); - codedOutputStream.writeRawBytes(input.baseFingerprint); - } else { - codedOutputStream.writeBoolNoTag(false); - } - context.serialize(input.checksum, codedOutputStream); - codedOutputStream.flush(); - byteArrayOutputStream.flush(); - byte[] serializedBytes = byteArrayOutputStream.toByteArray(); - cache.put(input, serializedBytes); - codedOut.writeInt32NoTag(serializedBytes.length); - codedOut.writeRawBytes(serializedBytes); - codedOut.flush(); - } - } - - @Override - public BuildOptions.OptionsDiffForReconstruction deserialize( - DeserializationContext context, CodedInputStream codedIn) - throws SerializationException, IOException { - byte[] serializedBytes = codedIn.readRawBytes(codedIn.readInt32()); - CodedInputStream codedInputStream = CodedInputStream.newInstance(serializedBytes); - context = context.getNewNonMemoizingContext(); - Map<Class<? extends FragmentOptions>, Map<String, Object>> differingOptions = - context.deserialize(codedInputStream); - ImmutableSet<Class<? extends FragmentOptions>> extraFirstFragmentClasses = - context.deserialize(codedInputStream); - ImmutableList<FragmentOptions> extraSecondFragments = context.deserialize(codedInputStream); - byte[] baseFingerprint = null; - if (codedInputStream.readBool()) { - baseFingerprint = codedInputStream.readRawBytes(codedInputStream.readInt32()); - } - String checksum = context.deserialize(codedInputStream); - return new OptionsDiffForReconstruction( - differingOptions, - extraFirstFragmentClasses, - extraSecondFragments, - baseFingerprint, - checksum); - } - - @Override - public Class<BuildOptions.OptionsDiffForReconstruction> getEncodedClass() { - return BuildOptions.OptionsDiffForReconstruction.class; - } - } } |