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:03:12 UTC

svn commit: r952394 - in /cassandra/trunk/src/java/org/apache/cassandra: gms/Gossiper.java service/StorageService.java

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);