[infinispan-commits] Infinispan SVN: r1017 - trunk/core/src/main/java/org/infinispan/distribution.
infinispan-commits at lists.jboss.org
infinispan-commits at lists.jboss.org
Mon Oct 26 13:25:10 EDT 2009
Author: manik.surtani at jboss.com
Date: 2009-10-26 13:25:10 -0400 (Mon, 26 Oct 2009)
New Revision: 1017
Modified:
trunk/core/src/main/java/org/infinispan/distribution/AbstractConsistentHash.java
trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java
trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java
trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java
Log:
Performance tweaks after profiling
Modified: trunk/core/src/main/java/org/infinispan/distribution/AbstractConsistentHash.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/AbstractConsistentHash.java 2009-10-26 17:02:36 UTC (rev 1016)
+++ trunk/core/src/main/java/org/infinispan/distribution/AbstractConsistentHash.java 2009-10-26 17:25:10 UTC (rev 1017)
@@ -19,4 +19,9 @@
for (Object k : keys) locations.put(k, locate(k, replCount));
return locations;
}
+
+ public boolean isKeyLocalToAddress(Address a, Object key, int replCount) {
+ // simple, brute-force impl
+ return locate(key, replCount).contains(a);
+ }
}
Modified: trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java 2009-10-26 17:02:36 UTC (rev 1016)
+++ trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java 2009-10-26 17:25:10 UTC (rev 1017)
@@ -72,4 +72,13 @@
* @return true if adjacent, false if not
*/
boolean isAdjacent(Address a1, Address a2);
+
+ /**
+ * Test to see whether a key is mapped to a given address.
+ * @param a address to test
+ * @param key key to test
+ * @param replCount repl count
+ * @return true if the key is mapped to the address; false otherwise
+ */
+ boolean isKeyLocalToAddress(Address a, Object key, int replCount);
}
Modified: trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java 2009-10-26 17:02:36 UTC (rev 1016)
+++ trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java 2009-10-26 17:25:10 UTC (rev 1017)
@@ -52,8 +52,7 @@
int keyHashCode = key.hashCode();
if (keyHashCode == Integer.MIN_VALUE) keyHashCode += 1;
int hash = Math.abs(keyHashCode);
- int clusterSize = addresses.size();
- int numCopiesToFind = min(replCount, clusterSize);
+ int numCopiesToFind = min(replCount, addresses.size());
List<Address> owners = new ArrayList<Address>(numCopiesToFind);
@@ -78,6 +77,39 @@
return owners;
}
+ @Override
+ public boolean isKeyLocalToAddress(Address target, Object key, int replCount) {
+ // more efficient impl
+ int keyHashCode = key.hashCode();
+ if (keyHashCode == Integer.MIN_VALUE) keyHashCode += 1;
+ int hash = Math.abs(keyHashCode);
+ int numCopiesToFind = min(replCount, addresses.size());
+
+ SortedMap<Integer, Address> candidates = positions.tailMap(hash % HASH_SPACE);
+ int nodesTested = 0;
+ for (Address a : candidates.values()) {
+ if (nodesTested++ < numCopiesToFind) {
+ if (a.equals(target)) return true;
+ } else {
+ break;
+ }
+ }
+
+ // start from the beginning
+ if (nodesTested < numCopiesToFind) {
+ for (Address a : positions.values()) {
+ if (nodesTested++ < numCopiesToFind) {
+ if (a.equals(target)) return true;
+ } else {
+ break;
+ }
+ }
+ }
+
+ return false;
+ }
+
+
public int getDistance(Address a1, Address a2) {
if (a1 == null || a2 == null) throw new NullPointerException("Cannot deal with nulls as parameters!");
Modified: trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java 2009-10-26 17:02:36 UTC (rev 1016)
+++ trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java 2009-10-26 17:25:10 UTC (rev 1017)
@@ -204,7 +204,7 @@
}
public boolean isLocal(Object key) {
- return consistentHash.locate(key, replCount).contains(self);
+ return consistentHash.isKeyLocalToAddress(self, key, replCount);
}
public List<Address> locate(Object key) {
More information about the infinispan-commits
mailing list