You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by gd...@apache.org on 2010/06/07 22:22:54 UTC
svn commit: r952415 - in /cassandra/branches/cassandra-0.6: CHANGES.txt
src/java/org/apache/cassandra/gms/Gossiper.java
src/java/org/apache/cassandra/service/StorageService.java
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);