summaryrefslogtreecommitdiffstats
path: root/vdslib
diff options
context:
space:
mode:
authorJon Marius Venstad <venstad@gmail.com>2021-01-19 22:28:39 +0100
committerJon Marius Venstad <venstad@gmail.com>2021-01-19 22:28:39 +0100
commit8393371bcece2ddff3e8b185e8e72747ad44c804 (patch)
treeec8c319272313f275177ddb867822967117934c7 /vdslib
parent7913d1f58cbd2a328719bcdcfec48d1e3b50b8b7 (diff)
Use direct bit operations instead of stored array
Diffstat (limited to 'vdslib')
-rw-r--r--vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java28
-rw-r--r--vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java1
2 files changed, 12 insertions, 17 deletions
diff --git a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java
index 26e8f074b49..393c7ab7697 100644
--- a/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java
+++ b/vdslib/src/main/java/com/yahoo/vdslib/distribution/Distribution.java
@@ -41,7 +41,6 @@ public class Distribution {
private final boolean distributorAutoOwnershipTransferOnWholeGroupDown;
}
- private final int[] distributionBitMasks = new int[65];
private ConfigSubscriber configSub;
private final AtomicReference<Config> config = new AtomicReference<>(new Config(null, 1, false));
@@ -149,13 +148,7 @@ public class Distribution {
}
}
-
public Distribution(String configId) {
- int mask = 0;
- for (int i=0; i<=64; ++i) {
- distributionBitMasks[i] = mask;
- mask = (mask << 1) | 1;
- }
try {
configSub = new ConfigSubscriber();
configSub.subscribe(configSubscriber, StorDistributionConfig.class, configId);
@@ -166,11 +159,6 @@ public class Distribution {
}
public Distribution(StorDistributionConfig config) {
- int mask = 0;
- for (int i=0; i<=64; ++i) {
- distributionBitMasks[i] = mask;
- mask = (mask << 1) | 1;
- }
configSubscriber.configure(config);
}
@@ -178,6 +166,13 @@ public class Distribution {
configure(config);
}
+ private long lastNBits(long value, int n) {
+ if (n < 0 || n > 64)
+ throw new IllegalArgumentException("n must be in [0, 64], but was " + n);
+
+ return value & ((1L << n) - 1);
+ }
+
public void close() {
if (configSub!=null) {
configSub.close();
@@ -187,22 +182,21 @@ public class Distribution {
}
private int getGroupSeed(BucketId bucket, ClusterState state, Group group) {
- int seed = ((int) bucket.getRawId()) & distributionBitMasks[state.getDistributionBitCount()];
+ int seed = (int) lastNBits(bucket.getRawId(), state.getDistributionBitCount());
seed ^= group.getDistributionHash();
return seed;
}
private int getDistributorSeed(BucketId bucket, ClusterState state) {
- return ((int) bucket.getRawId()) & distributionBitMasks[state.getDistributionBitCount()];
+ return (int) lastNBits(bucket.getRawId(), state.getDistributionBitCount());
}
private int getStorageSeed(BucketId bucket, ClusterState state) {
- int seed = ((int) bucket.getRawId()) & distributionBitMasks[state.getDistributionBitCount()];
+ int seed = (int) lastNBits(bucket.getRawId(), state.getDistributionBitCount());
if (bucket.getUsedBits() > 33) {
int usedBits = bucket.getUsedBits() - 1;
- seed ^= (distributionBitMasks[usedBits - 32]
- & (bucket.getRawId() >> 32)) << 6;
+ seed ^= lastNBits(bucket.getRawId() >> 32, usedBits - 32) << 6;
}
return seed;
}
diff --git a/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java b/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java
index 8c877704169..0d34cd70953 100644
--- a/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java
+++ b/vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java
@@ -418,4 +418,5 @@ public class DistributionTestCase {
Distribution distr = new Distribution(new StorDistributionConfig(config));
distr.getIdealDistributorNode(clusterState, new BucketId(16, 0), "uim");
}
+
}