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