[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