aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/main/java/com/google/devtools/build/lib/collect
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com/google/devtools/build/lib/collect')
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD1
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/DigestMap.java29
-rw-r--r--src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java6
3 files changed, 24 insertions, 12 deletions
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
index 134eaca919..853c35f9e9 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/BUILD
@@ -55,6 +55,7 @@ java_library(
":nestedset",
"//src/main/java/com/google/devtools/build/lib:util",
"//src/main/java/com/google/devtools/build/lib/actions:commandline_item",
+ "//src/main/java/com/google/devtools/build/lib/vfs",
"//third_party:guava",
],
)
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/DigestMap.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/DigestMap.java
index da6f6a47d5..30d53f0a14 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/DigestMap.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/DigestMap.java
@@ -15,6 +15,8 @@ package com.google.devtools.build.lib.collect.nestedset;
import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.util.Fingerprint;
+import com.google.devtools.build.lib.vfs.DigestHashFunction;
+import com.google.devtools.build.lib.vfs.DigestHashFunction.DigestLength;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReferenceArray;
import java.util.concurrent.locks.StampedLock;
@@ -33,7 +35,7 @@ import java.util.concurrent.locks.StampedLock;
*/
final class DigestMap {
private static final Object INSERTION_IN_PROGRESS = new Object();
- private final int digestSize;
+ private final DigestLength digestLength;
private final StampedLock readWriteLock = new StampedLock();
static class Table {
@@ -42,23 +44,23 @@ final class DigestMap {
final AtomicReferenceArray<Object> keys;
final byte[] bytes;
- Table(int tableSize, int digestSize) {
+ Table(int tableSize, int digestLength) {
this.tableSize = tableSize;
this.nextResize = getNextResize(tableSize);
this.keys = new AtomicReferenceArray<>(tableSize);
- this.bytes = new byte[tableSize * digestSize];
+ this.bytes = new byte[tableSize * digestLength];
}
}
private volatile Table table;
private final AtomicInteger allocatedSlots;
- DigestMap(int digestSize, int initialSize) {
+ DigestMap(DigestHashFunction digestHashFunction, int initialSize) {
Preconditions.checkArgument(
initialSize > 0 && (initialSize & (initialSize - 1)) == 0,
"initialSize must be a power of 2 greater than 0");
- this.digestSize = digestSize;
- this.table = new Table(initialSize, digestSize);
+ this.digestLength = digestHashFunction.getDigestLength();
+ this.table = new Table(initialSize, digestLength.getDigestMaximumLength());
this.allocatedSlots = new AtomicInteger();
}
@@ -67,7 +69,9 @@ final class DigestMap {
Table table = this.table; // Read once for duration of method
int index = findKey(table, key);
if (index >= 0) {
- fingerprint.addBytes(table.bytes, index * digestSize, digestSize);
+ int offset = index * this.digestLength.getDigestMaximumLength();
+ int digestLength = this.digestLength.getDigestLength(table.bytes, offset);
+ fingerprint.addBytes(table.bytes, offset, digestLength);
return true;
}
return false;
@@ -124,7 +128,9 @@ final class DigestMap {
readWriteLock.unlockRead(stamp);
}
// This can be done outside of the read lock since the slot is immutable once inserted
- readTo.addBytes(table.bytes, index * digestSize, digestSize);
+ int offset = index * this.digestLength.getDigestMaximumLength();
+ int digestLength = this.digestLength.getDigestLength(table.bytes, offset);
+ readTo.addBytes(table.bytes, offset, digestLength);
}
// Inserts a key into the passed table and returns the index.
@@ -140,7 +146,10 @@ final class DigestMap {
// Failure to do so could lead to a double insertion.
continue;
}
- digest.digestAndReset(table.bytes, index * digestSize, digestSize);
+ digest.digestAndReset(
+ table.bytes,
+ index * digestLength.getDigestMaximumLength(),
+ digestLength.getDigestMaximumLength());
table.keys.set(index, key);
return index;
} else if (currentKey == key) {
@@ -160,7 +169,7 @@ final class DigestMap {
}
private void resizeTableWriteLocked() {
- int digestSize = this.digestSize;
+ int digestSize = this.digestLength.getDigestMaximumLength();
Table oldTable = this.table;
Table newTable = new Table(oldTable.tableSize * 2, digestSize);
for (int i = 0; i < oldTable.tableSize; ++i) {
diff --git a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java
index 8eb4131793..e0481b98f6 100644
--- a/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java
+++ b/src/main/java/com/google/devtools/build/lib/collect/nestedset/NestedSetFingerprintCache.java
@@ -20,6 +20,7 @@ import com.google.common.collect.Multiset;
import com.google.devtools.build.lib.actions.CommandLineItem;
import com.google.devtools.build.lib.actions.CommandLineItem.MapFn;
import com.google.devtools.build.lib.util.Fingerprint;
+import com.google.devtools.build.lib.vfs.DigestHashFunction;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
@@ -27,7 +28,6 @@ import java.util.concurrent.ConcurrentHashMap;
/** Computes fingerprints for nested sets, reusing sub-computations from children. */
public class NestedSetFingerprintCache {
- private static final int DIGEST_SIZE = 16;
private static final int EMPTY_SET_DIGEST = 104_395_303;
/** Memoize the subresults. We have to have one cache per type of command item map function. */
@@ -121,6 +121,8 @@ public class NestedSetFingerprintCache {
mapFnClass.getName()));
}
}
- return new DigestMap(DIGEST_SIZE, 1024);
+ // TODO(b/112460990): Use the value from DigestHashFunction.getDefault(), but check for
+ // contention.
+ return new DigestMap(DigestHashFunction.MD5, 1024);
}
}