aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/analysis
diff options
context:
space:
mode:
authorGravatar mjhalupka <mjhalupka@google.com>2018-07-12 15:30:25 -0700
committerGravatar Copybara-Service <copybara-piper@google.com>2018-07-12 15:32:17 -0700
commitd8a2d52495d457e9cff81b77bbac5c9ccdd7c548 (patch)
tree94aef045f748f8ff345e2d3c71a6c2bc77e9714c /src/main/java/com/google/devtools/build/lib/analysis
parentb29b5bf815082990a25b9f6c8f2c4d0b4b854922 (diff)
Read a byte array instead of a certain number of bytes that are indicated by a
preceding integer when serializing BuildOptions.DiffForReconstruction. Reorder the cache map inserts due to a subtle race condition that can occur. PiperOrigin-RevId: 204376273
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/analysis')
-rw-r--r--src/main/java/com/google/devtools/build/lib/analysis/config/BuildOptions.java10
1 files changed, 6 insertions, 4 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 603d2df6c4..e4be9a3f2c 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
@@ -660,7 +660,6 @@ public final class BuildOptions implements Cloneable, Serializable {
context.serialize(diff.differingOptions, bytesOut);
context.serialize(diff.extraFirstFragmentClasses, bytesOut);
context.serialize(diff.extraSecondFragments, bytesOut);
- bytesOut.writeInt32NoTag(diff.baseFingerprint.length);
bytesOut.writeByteArrayNoTag(diff.baseFingerprint);
context.serialize(diff.checksum, bytesOut);
bytesOut.flush();
@@ -693,8 +692,7 @@ public final class BuildOptions implements Cloneable, Serializable {
ImmutableSet<Class<? extends FragmentOptions>> extraFirstFragmentClasses =
context.deserialize(codedInput);
ImmutableList<FragmentOptions> extraSecondFragments = context.deserialize(codedInput);
- int fingerprintLength = codedInput.readInt32();
- byte[] baseFingerprint = codedInput.readRawBytes(fingerprintLength);
+ byte[] baseFingerprint = codedInput.readByteArray();
String checksum = context.deserialize(codedInput);
diff =
new OptionsDiffForReconstruction(
@@ -750,8 +748,12 @@ public final class BuildOptions implements Cloneable, Serializable {
@Override
public void putBytesFromOptionsDiff(OptionsDiffForReconstruction diff, ByteString bytes) {
- diffToByteStringMap.put(diff, bytes);
+ // We need to insert data into map that will be used for deserialization first in case there
+ // is a race between two threads. This can occur when one thread has called this method
+ // and populates one map, giving the other thread a cache hit, but hasn't populated the
+ // other map yet so on deserialization there is a cache miss.
byteStringToDiffMap.put(bytes, diff);
+ diffToByteStringMap.put(diff, bytes);
}
@Override