Author: gdusbabek
Date: Mon Jun  7 20:03:11 2010
New Revision: 952394

URL: http://svn.apache.org/viewvc?rev=952394&view=rev
Log:
use generation time to resolve node token reassignment disagreement. patch by 
gdusbabek, reviewed by jbellis. CASSANDRA-1118

Modified:
    cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
    cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java

Modified: cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java?rev=952394&r1=952393&r2=952394&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java (original)
+++ cassandra/trunk/src/java/org/apache/cassandra/gms/Gossiper.java Mon Jun  7 
20:03:11 2010
@@ -480,6 +480,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();
+    }
+
     void notifyFailureDetector(List<GossipDigest> gDigests)
     {
         IFailureDetector fd = FailureDetector.instance;

Modified: 
cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java
URL: 
http://svn.apache.org/viewvc/cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java?rev=952394&r1=952393&r2=952394&view=diff
==============================================================================
--- cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java 
(original)
+++ cassandra/trunk/src/java/org/apache/cassandra/service/StorageService.java 
Mon Jun  7 20:03:11 2010
@@ -595,7 +595,12 @@ 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);


Reply via email to