Author: brandonwilliams
Date: Fri Oct 21 22:21:54 2011
New Revision: 1187578

URL: http://svn.apache.org/viewvc?rev=1187578&view=rev
Log:
Prevent nodes that failed to join from being stuck in the joining state
indefinitely.
Patch by brandonwilliams, reviewed by Paul Cannon for CASSANDRA-3351

Modified:
    cassandra/branches/cassandra-0.8/CHANGES.txt
    
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/gms/Gossiper.java

Modified: cassandra/branches/cassandra-0.8/CHANGES.txt
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/CHANGES.txt?rev=1187578&r1=1187577&r2=1187578&view=diff
==============================================================================
--- cassandra/branches/cassandra-0.8/CHANGES.txt (original)
+++ cassandra/branches/cassandra-0.8/CHANGES.txt Fri Oct 21 22:21:54 2011
@@ -29,6 +29,7 @@
  * fix assertionError during repair with ordered partitioners (CASSANDRA-3369)
  * correctly serialize key_validation_class for avro (CASSANDRA-3391)
  * don't expire counter tombstone after streaming (CASSANDRA-3394)
+ * prevent nodes that failed to join from hanging around forever 
(CASSANDRA-3351)
 
 
 0.8.7

Modified: 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/gms/Gossiper.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/gms/Gossiper.java?rev=1187578&r1=1187577&r2=1187578&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/gms/Gossiper.java
 (original)
+++ 
cassandra/branches/cassandra-0.8/src/java/org/apache/cassandra/gms/Gossiper.java
 Fri Oct 21 22:21:54 2011
@@ -541,15 +541,18 @@ public class Gossiper implements IFailur
             {
                 long duration = now - epState.getUpdateTimestamp();
 
-                if 
(StorageService.instance.getTokenMetadata().isMember(endpoint))
-                    epState.setHasToken(true);
                 // check if this is a fat client. fat clients are removed 
automatically from
                 // gosip after FatClientTimeout
                 if (!epState.hasToken() && !epState.isAlive() && 
!justRemovedEndpoints.containsKey(endpoint) && (duration > FatClientTimeout))
                 {
-                    logger.info("FatClient " + endpoint + " has been silent 
for " + FatClientTimeout + "ms, removing from gossip");
-                    removeEndpoint(endpoint); // will put it in 
justRemovedEndpoints to respect quarantine delay
-                    evictFromMembership(endpoint); // can get rid of the state 
immediately
+                    if 
(StorageService.instance.getTokenMetadata().isMember(endpoint))
+                        epState.setHasToken(true);
+                    else
+                    {
+                        logger.info("FatClient " + endpoint + " has been 
silent for " + FatClientTimeout + "ms, removing from gossip");
+                        removeEndpoint(endpoint); // will put it in 
justRemovedEndpoints to respect quarantine delay
+                        evictFromMembership(endpoint); // can get rid of the 
state immediately
+                    }
                 }
 
                 if ( !epState.isAlive() && (duration > aVeryLongTime) && 
(!StorageService.instance.getTokenMetadata().isMember(endpoint)))
@@ -728,7 +731,7 @@ public class Gossiper implements IFailur
      */
     private void handleMajorStateChange(InetAddress ep, EndpointState epState)
     {
-        if (epState.getApplicationState(ApplicationState.STATUS) != null && 
!isDeadState(epState.getApplicationState(ApplicationState.STATUS).value))
+        if (!isDeadState(epState))
         {
             if (endpointStateMap.get(ep) != null)
                 logger.info("Node {} has restarted, now UP again", ep);
@@ -743,7 +746,7 @@ public class Gossiper implements IFailur
         for (IEndpointStateChangeSubscriber subscriber : subscribers)
             subscriber.onRestart(ep, epState);
 
-        if (epState.getApplicationState(ApplicationState.STATUS) != null && 
!isDeadState(epState.getApplicationState(ApplicationState.STATUS).value))
+        if (!isDeadState(epState))
             markAlive(ep, epState);
         else
         {
@@ -755,8 +758,11 @@ public class Gossiper implements IFailur
             subscriber.onJoin(ep, epState);
     }
 
-    private Boolean isDeadState(String value)
+    private Boolean isDeadState(EndpointState epState)
     {
+        if (epState.getApplicationState(ApplicationState.STATUS) == null)
+            return false;
+        String value = 
epState.getApplicationState(ApplicationState.STATUS).value;
         String[] pieces = value.split(VersionedValue.DELIMITER_STR, -1);
         assert (pieces.length > 0);
         String state = pieces[0];


Reply via email to