aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
diff options
context:
space:
mode:
authorGravatar janakr <janakr@google.com>2018-05-14 12:06:36 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-05-14 12:08:36 -0700
commit5217712b50674f283b36192b4b67c173aecb2172 (patch)
tree4200a56b4664646860958c6cc258782a7ef05ff5 /src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java
parent9980c7b98e880433f9be21b25eedf7dd6f4ca234 (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.java89
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;
- }
- }
}