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