Author: gdusbabek
Date: Mon Jun 7 20:22:53 2010
New Revision: 952415
URL: http://svn.apache.org/viewvc?rev=952415&view=rev
Log:
node generation to resolve node token reassignment disagreements. patch by
gdusbabek, reviewed by jbellis. CASSANDRA-1118
Modified:
cassandra/branches/cassandra-0.6/CHANGES.txt
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/gms/Gossiper.java
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
Modified: cassandra/branches/cassandra-0.6/CHANGES.txt
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/CHANGES.txt?rev=952415&r1=952414&r2=952415&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.6/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.6/CHANGES.txt Mon Jun 7 20:22:53 2010
@@ -14,6 +14,8 @@
(CASSANDRA-1057)
* detect partioner config changes between restarts and fail fast
(CASSANDRA-1146)
+ * use generation time to resolve node token reassignment disagreements
+ (CASSANDRA-1118)
0.6.2
Modified:
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/gms/Gossiper.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/gms/Gossiper.java?rev=952415&r1=952414&r2=952415&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/gms/Gossiper.java
(original)
+++
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/gms/Gossiper.java
Mon Jun 7 20:22:53 2010
@@ -472,6 +472,15 @@ public class Gossiper implements IFailur
}
return reqdEndPointState;
}
+
+ /** determine which endpoint started up earlier */
+ public int compareEndpointStartup(InetAddress addr1, InetAddress addr2)
+ {
+ EndPointState ep1 = getEndPointStateForEndPoint(addr1);
+ EndPointState ep2 = getEndPointStateForEndPoint(addr2);
+ assert ep1 != null && ep2 != null;
+ return ep1.getHeartBeatState().getGeneration() -
ep2.getHeartBeatState().getGeneration();
+ }
/*
* This method is called only from the JoinVerbHandler. This happens
Modified:
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
URL:
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java?rev=952415&r1=952414&r2=952415&view=diff
==============================================================================
---
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
(original)
+++
cassandra/branches/cassandra-0.6/src/java/org/apache/cassandra/service/StorageService.java
Mon Jun 7 20:22:53 2010
@@ -547,7 +547,13 @@ public class StorageService implements I
if (tokenMetadata_.isMember(endPoint))
logger_.info("Node " + endPoint + " state jump to normal");
- tokenMetadata_.updateNormalToken(token, endPoint);
+ // we don't want to update if this node is responsible for the token
and it has a later startup time than endpoint.
+ InetAddress currentNode = tokenMetadata_.getEndPoint(token);
+ if (currentNode == null ||
(FBUtilities.getLocalAddress().equals(currentNode) &&
Gossiper.instance.compareEndpointStartup(endPoint, currentNode) > 0))
+ tokenMetadata_.updateNormalToken(token, endPoint);
+ else
+ logger_.info("Will not change my token ownership to " + endPoint);
+
calculatePendingRanges();
if (!isClientMode)
SystemTable.updateToken(endPoint, token);