diff options
author | Jon Marius Venstad <venstad@gmail.com> | 2021-01-19 22:28:39 +0100 |
---|---|---|
committer | Jon Marius Venstad <venstad@gmail.com> | 2021-01-19 22:28:39 +0100 |
commit | 8393371bcece2ddff3e8b185e8e72747ad44c804 (patch) | |
tree | ec8c319272313f275177ddb867822967117934c7 /vdslib | |
parent | 7913d1f58cbd2a328719bcdcfec48d1e3b50b8b7 (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.java | 28 | ||||
-rw-r--r-- | vdslib/src/test/java/com/yahoo/vdslib/distribution/DistributionTestCase.java | 1 |
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"); } + } |