Correctly expire gossip states for edge cases.
Patch by yangwei, reviewed by brandonwilliams for CASSANDRA-5216


Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo
Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/b1274b8c
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/b1274b8c
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/b1274b8c

Branch: refs/heads/trunk
Commit: b1274b8c2a9eb6b504afac8f17a42889746b7d00
Parents: b251e7a
Author: Brandon Williams <brandonwilli...@apache.org>
Authored: Mon Feb 4 13:04:58 2013 -0600
Committer: Brandon Williams <brandonwilli...@apache.org>
Committed: Mon Feb 4 13:06:40 2013 -0600

----------------------------------------------------------------------
 CHANGES.txt                                        |    1 +
 src/java/org/apache/cassandra/gms/Gossiper.java    |    6 +++++-
 .../apache/cassandra/service/StorageService.java   |    3 +++
 3 files changed, 9 insertions(+), 1 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/b1274b8c/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 6b3a705..e0e8079 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -7,6 +7,7 @@
  * configure populate_io_cache_on_flush per-CF (CASSANDRA-4694)
  * allow configuration of internode socket buffer (CASSANDRA-3378)
  * Make sstable directory picking blacklist-aware again (CASSANDRA-5193)
+ * Correctly expire gossip states for edge cases (CASSANDRA-5216)
 
 1.2.1
  * stream undelivered hints on decommission (CASSANDRA-5128)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b1274b8c/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/gms/Gossiper.java 
b/src/java/org/apache/cassandra/gms/Gossiper.java
index 9ee2f61..c9d0d51 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -234,6 +234,8 @@ public class Gossiper implements 
IFailureDetectionEventListener, GossiperMBean
         {
             markDead(endpoint, epState);
         }
+        else
+            epState.markDead();
     }
 
     /**
@@ -389,8 +391,10 @@ public class Gossiper implements 
IFailureDetectionEventListener, GossiperMBean
         EndpointState epState = endpointStateMap.get(endpoint);
         epState.updateTimestamp(); // make sure we don't evict it too soon
         epState.getHeartBeatState().forceNewerGenerationUnsafe();
-        epState.addApplicationState(ApplicationState.STATUS, 
StorageService.instance.valueFactory.removedNonlocal(hostId, 
computeExpireTime()));
+        long expireTime = computeExpireTime();
+        epState.addApplicationState(ApplicationState.STATUS, 
StorageService.instance.valueFactory.removedNonlocal(hostId, expireTime));
         logger.info("Completing removal of " + endpoint);
+        addExpireTimeForEndpoint(endpoint, expireTime);
         endpointStateMap.put(endpoint, epState);
         // ensure at least one gossip round occurs before returning
         try

http://git-wip-us.apache.org/repos/asf/cassandra/blob/b1274b8c/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/service/StorageService.java 
b/src/java/org/apache/cassandra/service/StorageService.java
index 979b68e..34b2f12 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -1554,7 +1554,10 @@ public class StorageService extends 
NotificationBroadcasterSupport implements IE
             }
         }
         else // now that the gossiper has told us about this nonexistent 
member, notify the gossiper to remove it
+        {
+            addExpireTimeIfFound(endpoint, extractExpireTime(pieces, 
MessagingService.instance().getVersion(endpoint)));
             removeEndpoint(endpoint);
+        }
     }
 
     private void excise(Collection<Token> tokens, InetAddress endpoint)

Reply via email to