Repository: cassandra
Updated Branches:
  refs/heads/trunk 6630b8786 -> 18549038a


Gossip should ignore generation numbers too far in the future

patch by jasobrown; reviewed by driftx for CASSANDRA-8113


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

Branch: refs/heads/trunk
Commit: 8be8a086cb40f3280e9af5543d7b170241b268d8
Parents: ae9c066
Author: Jason Brown <jasedbr...@gmail.com>
Authored: Tue Oct 14 14:55:42 2014 -0700
Committer: Jason Brown <jasedbr...@gmail.com>
Committed: Tue Oct 14 14:55:42 2014 -0700

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 src/java/org/apache/cassandra/gms/Gossiper.java | 11 ++++++++++-
 2 files changed, 11 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/8be8a086/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 1c7ee38..6d9d221 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 2.1.1
+ * Gossip should ignore generation numbers too far in the future 
(CASSANDRA-8113)
  * Fix NPE when creating a table with frozen sets, lists (CASSANDRA-8104)
  * Fix high memory use due to tracking reads on incrementally opened sstable
    readers (CASSANDRA-8066)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/8be8a086/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 bedc8d7..ae8bf32 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -82,6 +82,9 @@ public class Gossiper implements 
IFailureDetectionEventListener, GossiperMBean
     public static final Gossiper instance = new Gossiper();
 
     public static final long aVeryLongTime = 259200 * 1000; // 3 days
+
+    /** Maximimum difference in generation and version values we are willing 
to accept about a peer */
+    private static final long MAX_GENERATION_DIFFERENCE = 86400 * 365;
     private long FatClientTimeout;
     private final Random random = new Random();
     private final Comparator<InetAddress> inetcomparator = new 
Comparator<InetAddress>()
@@ -984,7 +987,13 @@ public class Gossiper implements 
IFailureDetectionEventListener, GossiperMBean
                 if (logger.isTraceEnabled())
                     logger.trace(ep + "local generation " + localGeneration + 
", remote generation " + remoteGeneration);
 
-                if (remoteGeneration > localGeneration)
+                if (remoteGeneration > localGeneration + 
MAX_GENERATION_DIFFERENCE)
+                {
+                    // assume some peer has corrupted memory and is 
broadcasting an unbelievable generation about another peer (or itself)
+                    logger.warn("received an invalid gossip generation for 
peer {}; local generation = {}, received generation = {}", ep, localGeneration, 
remoteGeneration);
+                    continue;
+                }
+                else if (remoteGeneration > localGeneration)
                 {
                     if (logger.isTraceEnabled())
                         logger.trace("Updating heartbeat state generation to " 
+ remoteGeneration + " from " + localGeneration + " for " + ep);

Reply via email to