[infinispan-commits] Infinispan SVN: r1211 - trunk/core/src/main/java/org/infinispan/distribution.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Tue Nov 24 07:25:37 EST 2009


Author: manik.surtani at jboss.com
Date: 2009-11-24 07:25:37 -0500 (Tue, 24 Nov 2009)
New Revision: 1211

Modified:
   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:
Prevent weird errors when rehashing

Modified: trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java	2009-11-24 11:44:30 UTC (rev 1210)
+++ trunk/core/src/main/java/org/infinispan/distribution/ConsistentHash.java	2009-11-24 12:25:37 UTC (rev 1211)
@@ -60,7 +60,7 @@
     * @param a2 address to test
     * @return the distance between the 2 nodes.  Always a positive number, where the distance between a1 and itself is
     *         0. The distance between a1 and the next adjacent node is 1 and teh distance between a1 and the previous
-    *         adjacent node is caches.size() - 1.
+    *         adjacent node is caches.size() - 1.  A -1 may be returned if either of the addresses do not exist.
     */
    int getDistance(Address a1, Address a2);
 

Modified: trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java	2009-11-24 11:44:30 UTC (rev 1210)
+++ trunk/core/src/main/java/org/infinispan/distribution/DefaultConsistentHash.java	2009-11-24 12:25:37 UTC (rev 1211)
@@ -123,11 +123,11 @@
 
       int p1 = addresses.indexOf(a1);
       if (p1 < 0)
-         throw new IllegalArgumentException("Address " + a1 + " not in the addresses list of this consistent hash impl!");
+         return -1;
 
       int p2 = addresses.indexOf(a2);
       if (p2 < 0)
-         throw new IllegalArgumentException("Address " + a2 + " not in the addresses list of this consistent hash impl!");
+         return -1;
 
       if (p1 <= p2)
          return p2 - p1;

Modified: trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java	2009-11-24 11:44:30 UTC (rev 1210)
+++ trunk/core/src/main/java/org/infinispan/distribution/DistributionManagerImpl.java	2009-11-24 12:25:37 UTC (rev 1211)
@@ -175,7 +175,8 @@
          boolean willReceiveLeaverState = willReceiveLeaverState(leaver);
          boolean willSendLeaverState = willSendLeaverState(leaver);
          try {
-            oldConsistentHash = consistentHash;
+            if (!(consistentHash instanceof UnionConsistentHash)) oldConsistentHash = consistentHash;
+            else oldConsistentHash = ((UnionConsistentHash) consistentHash).newCH;
             consistentHash = ConsistentHashHelper.removeAddress(consistentHash, leaver, configuration);
          } catch (Exception e) {
             log.fatal("Unable to process leaver!!", e);
@@ -204,18 +205,18 @@
    }
 
    boolean willSendLeaverState(Address leaver) {
-      return consistentHash.isAdjacent(leaver, self);
+      ConsistentHash ch = consistentHash instanceof UnionConsistentHash ? oldConsistentHash : consistentHash;
+      return ch.isAdjacent(leaver, self);
    }
 
    boolean willReceiveLeaverState(Address leaver) {
       ConsistentHash ch = consistentHash instanceof UnionConsistentHash ? oldConsistentHash : consistentHash;
       int dist = ch.getDistance(leaver, self);
-      return dist <= replCount;
+      return dist >= 0 && dist <= replCount;
    }
 
    public boolean isLocal(Object key) {
-      if (consistentHash == null) return true;
-      return consistentHash.isKeyLocalToAddress(self, key, replCount);
+      return consistentHash == null || consistentHash.isKeyLocalToAddress(self, key, replCount);
    }
 
    public List<Address> locate(Object key) {
@@ -296,11 +297,13 @@
          if (consistentHash instanceof UnionConsistentHash) {
             UnionConsistentHash uch = (UnionConsistentHash) consistentHash;
             consistentHash = uch.getNewConsistentHash();
+            oldConsistentHash = null;
          }
          rehashInProgress = false;
       } else {
          ConsistentHash chOld = consistentHash;
          if (chOld instanceof UnionConsistentHash) throw new RuntimeException("Not expecting a union CH!");
+         oldConsistentHash = chOld;
          this.joiner = joiner;
          rehashInProgress = true;
 



More information about the infinispan-commits mailing list