[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