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