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