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