You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by br...@apache.org on 2014/01/30 00:37:28 UTC

[1/6] git commit: Handle host id conflicts properly. Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-6615

Updated Branches:
  refs/heads/cassandra-1.2 1d81765da -> 6c4333e3d
  refs/heads/cassandra-2.0 b44683c4a -> 39bdb2be9
  refs/heads/trunk 7dec15bab -> 5afc79b27


Handle host id conflicts properly.
Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-6615


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

Branch: refs/heads/cassandra-1.2
Commit: 6c4333e3d47dfe3fad9781e3c36a5c84476af1d3
Parents: 1d81765
Author: Brandon Williams <br...@apache.org>
Authored: Wed Jan 29 17:30:42 2014 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Wed Jan 29 17:31:45 2014 -0600

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 2920c15..d88bb26 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -19,6 +19,7 @@
  * Add properties to adjust FD initial value and max interval (CASSANDRA-4375)
  * Fix preparing with batch and delete from collection (CASSANDRA-6607)
  * Fix ABSC reverse iterator's remove() method (CASSANDRA-6629)
+ * Handle host ID conflicts properly (CASSANDRA-6615)
 
 
 1.2.13

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/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 3ed6cba..b51bbd3 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -596,7 +596,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
         {
             return false;
         }
-        return !isDeadState(epState) && !epState.isAlive() && !StorageService.instance.getTokenMetadata().isMember(endpoint);
+        return !isDeadState(epState) && !StorageService.instance.getTokenMetadata().isMember(endpoint);
     }
 
     private void doStatusCheck()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/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 ab266d8..c93ea5b 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -1453,6 +1453,12 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
         tokens = getTokensFor(endpoint, pieces[1]);
 
+        Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
+        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
+        Set<Token> localTokensToRemove = new HashSet<Token>();
+        Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+
+
         if (logger.isDebugEnabled())
             logger.debug("Node " + endpoint + " state normal, token " + tokens);
 
@@ -1463,16 +1469,38 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (Gossiper.instance.usesHostId(endpoint))
         {
             UUID hostId = Gossiper.instance.getHostId(endpoint);
+            InetAddress existing = tokenMetadata.getEndpointForHostId(hostId);
             if (DatabaseDescriptor.isReplacing() && Gossiper.instance.getEndpointStateForEndpoint(DatabaseDescriptor.getReplaceAddress()) != null && (hostId.equals(Gossiper.instance.getHostId(DatabaseDescriptor.getReplaceAddress()))))
                 logger.warn("Not updating token metadata for {} because I am replacing it", endpoint);
             else
-                tokenMetadata.updateHostId(hostId, endpoint);
-        }
+            {
+                if (existing != null && !existing.equals(endpoint))
+                {
+                    if (existing.equals(FBUtilities.getBroadcastAddress()))
+                    {
+                        logger.warn("Not updating host ID {} for {} because it's mine", hostId, endpoint);
+                        tokenMetadata.removeEndpoint(endpoint);
+                        endpointsToRemove.add(endpoint);
+                    }
+                    else if (Gossiper.instance.compareEndpointStartup(endpoint, existing) > 0)
+                    {
+                        logger.warn("Host ID collision for {} between {} and {}; {} is the new owner", hostId, existing, endpoint, endpoint);
+                        tokenMetadata.removeEndpoint(existing);
+                        endpointsToRemove.add(existing);
+                        tokenMetadata.updateHostId(hostId, endpoint);
+                    }
+                    else
+                    {
+                        logger.warn("Host ID Collision for {} between {} and {}; ignored {}", hostId, existing, endpoint, endpoint);
+                        tokenMetadata.removeEndpoint(endpoint);
+                        endpointsToRemove.add(endpoint);
+                    }
+                }
+                else
+                    tokenMetadata.updateHostId(hostId, endpoint);
+            }
 
-        Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
-        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
-        Set<Token> localTokensToRemove = new HashSet<Token>();
-        Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+        }
 
         for (final Token token : tokens)
         {


[2/6] git commit: Handle host id conflicts properly. Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-6615

Posted by br...@apache.org.
Handle host id conflicts properly.
Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-6615


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

Branch: refs/heads/cassandra-2.0
Commit: 6c4333e3d47dfe3fad9781e3c36a5c84476af1d3
Parents: 1d81765
Author: Brandon Williams <br...@apache.org>
Authored: Wed Jan 29 17:30:42 2014 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Wed Jan 29 17:31:45 2014 -0600

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 2920c15..d88bb26 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -19,6 +19,7 @@
  * Add properties to adjust FD initial value and max interval (CASSANDRA-4375)
  * Fix preparing with batch and delete from collection (CASSANDRA-6607)
  * Fix ABSC reverse iterator's remove() method (CASSANDRA-6629)
+ * Handle host ID conflicts properly (CASSANDRA-6615)
 
 
 1.2.13

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/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 3ed6cba..b51bbd3 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -596,7 +596,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
         {
             return false;
         }
-        return !isDeadState(epState) && !epState.isAlive() && !StorageService.instance.getTokenMetadata().isMember(endpoint);
+        return !isDeadState(epState) && !StorageService.instance.getTokenMetadata().isMember(endpoint);
     }
 
     private void doStatusCheck()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/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 ab266d8..c93ea5b 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -1453,6 +1453,12 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
         tokens = getTokensFor(endpoint, pieces[1]);
 
+        Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
+        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
+        Set<Token> localTokensToRemove = new HashSet<Token>();
+        Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+
+
         if (logger.isDebugEnabled())
             logger.debug("Node " + endpoint + " state normal, token " + tokens);
 
@@ -1463,16 +1469,38 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (Gossiper.instance.usesHostId(endpoint))
         {
             UUID hostId = Gossiper.instance.getHostId(endpoint);
+            InetAddress existing = tokenMetadata.getEndpointForHostId(hostId);
             if (DatabaseDescriptor.isReplacing() && Gossiper.instance.getEndpointStateForEndpoint(DatabaseDescriptor.getReplaceAddress()) != null && (hostId.equals(Gossiper.instance.getHostId(DatabaseDescriptor.getReplaceAddress()))))
                 logger.warn("Not updating token metadata for {} because I am replacing it", endpoint);
             else
-                tokenMetadata.updateHostId(hostId, endpoint);
-        }
+            {
+                if (existing != null && !existing.equals(endpoint))
+                {
+                    if (existing.equals(FBUtilities.getBroadcastAddress()))
+                    {
+                        logger.warn("Not updating host ID {} for {} because it's mine", hostId, endpoint);
+                        tokenMetadata.removeEndpoint(endpoint);
+                        endpointsToRemove.add(endpoint);
+                    }
+                    else if (Gossiper.instance.compareEndpointStartup(endpoint, existing) > 0)
+                    {
+                        logger.warn("Host ID collision for {} between {} and {}; {} is the new owner", hostId, existing, endpoint, endpoint);
+                        tokenMetadata.removeEndpoint(existing);
+                        endpointsToRemove.add(existing);
+                        tokenMetadata.updateHostId(hostId, endpoint);
+                    }
+                    else
+                    {
+                        logger.warn("Host ID Collision for {} between {} and {}; ignored {}", hostId, existing, endpoint, endpoint);
+                        tokenMetadata.removeEndpoint(endpoint);
+                        endpointsToRemove.add(endpoint);
+                    }
+                }
+                else
+                    tokenMetadata.updateHostId(hostId, endpoint);
+            }
 
-        Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
-        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
-        Set<Token> localTokensToRemove = new HashSet<Token>();
-        Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+        }
 
         for (final Token token : tokens)
         {


[6/6] git commit: Merge branch 'cassandra-2.0' into trunk

Posted by br...@apache.org.
Merge branch 'cassandra-2.0' into trunk


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

Branch: refs/heads/trunk
Commit: 5afc79b27eb3cba7862266dad9f6e74a39c5da85
Parents: 7dec15b 39bdb2b
Author: Brandon Williams <br...@apache.org>
Authored: Wed Jan 29 17:35:32 2014 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Wed Jan 29 17:35:32 2014 -0600

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/5afc79b2/CHANGES.txt
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5afc79b2/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/5afc79b2/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageService.java
index b5b2445,9eb4e92..fe04b81
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@@ -1436,18 -1438,31 +1436,24 @@@ public class StorageService extends Not
       * in reads.
       *
       * @param endpoint node
 -     * @param pieces STATE_NORMAL,token
       */
 -    private void handleStateNormal(final InetAddress endpoint, String[] pieces)
 +    private void handleStateNormal(final InetAddress endpoint)
      {
 -        assert pieces.length >= 2;
 -
 -        // Parse versioned values according to end-point version:
 -        //   versions  < 1.2 .....: STATUS,TOKEN
 -        //   versions >= 1.2 .....: uses HOST_ID/TOKENS app states
 -
          Collection<Token> tokens;
  
 -        tokens = getTokensFor(endpoint, pieces[1]);
 +        tokens = getTokensFor(endpoint);
  
+         Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
+         Set<Token> tokensToUpdateInSystemKeyspace = new HashSet<Token>();
+         Set<Token> localTokensToRemove = new HashSet<Token>();
+         Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+ 
+ 
          if (logger.isDebugEnabled())
 -            logger.debug("Node " + endpoint + " state normal, token " + tokens);
 +            logger.debug("Node {} state normal, token {}", endpoint, tokens);
  
          if (tokenMetadata.isMember(endpoint))
 -            logger.info("Node " + endpoint + " state jump to normal");
 +            logger.info("Node {} state jump to normal", endpoint);
  
          // Order Matters, TM.updateHostID() should be called before TM.updateNormalToken(), (see CASSANDRA-4300).
          if (Gossiper.instance.usesHostId(endpoint))


[4/6] git commit: Merge branch 'cassandra-1.2' into cassandra-2.0

Posted by br...@apache.org.
Merge branch 'cassandra-1.2' into cassandra-2.0

Conflicts:
	src/java/org/apache/cassandra/service/StorageService.java


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

Branch: refs/heads/trunk
Commit: 39bdb2be978b490c9b64068a67e812c07b63dca2
Parents: b44683c 6c4333e
Author: Brandon Williams <br...@apache.org>
Authored: Wed Jan 29 17:35:22 2014 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Wed Jan 29 17:35:22 2014 -0600

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/39bdb2be/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 94eaa79,d88bb26..a059d84
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -28,29 -19,10 +28,30 @@@ Merged from 1.2
   * Add properties to adjust FD initial value and max interval (CASSANDRA-4375)
   * Fix preparing with batch and delete from collection (CASSANDRA-6607)
   * Fix ABSC reverse iterator's remove() method (CASSANDRA-6629)
+  * Handle host ID conflicts properly (CASSANDRA-6615)
  
  
 -1.2.13
 +2.0.4
 + * Allow removing snapshots of no-longer-existing CFs (CASSANDRA-6418)
 + * add StorageService.stopDaemon() (CASSANDRA-4268)
 + * add IRE for invalid CF supplied to get_count (CASSANDRA-5701)
 + * add client encryption support to sstableloader (CASSANDRA-6378)
 + * Fix accept() loop for SSL sockets post-shutdown (CASSANDRA-6468)
 + * Fix size-tiered compaction in LCS L0 (CASSANDRA-6496)
 + * Fix assertion failure in filterColdSSTables (CASSANDRA-6483)
 + * Fix row tombstones in larger-than-memory compactions (CASSANDRA-6008)
 + * Fix cleanup ClassCastException (CASSANDRA-6462)
 + * Reduce gossip memory use by interning VersionedValue strings (CASSANDRA-6410)
 + * Allow specifying datacenters to participate in a repair (CASSANDRA-6218)
 + * Fix divide-by-zero in PCI (CASSANDRA-6403)
 + * Fix setting last compacted key in the wrong level for LCS (CASSANDRA-6284)
 + * Add millisecond precision formats to the timestamp parser (CASSANDRA-6395)
 + * Expose a total memtable size metric for a CF (CASSANDRA-6391)
 + * cqlsh: handle symlinks properly (CASSANDRA-6425)
 + * Fix potential infinite loop when paging query with IN (CASSANDRA-6464)
 + * Fix assertion error in AbstractQueryPager.discardFirst (CASSANDRA-6447)
 + * Fix streaming older SSTable yields unnecessary tombstones (CASSANDRA-6527)
 +Merged from 1.2:
   * Improved error message on bad properties in DDL queries (CASSANDRA-6453)
   * Randomize batchlog candidates selection (CASSANDRA-6481)
   * Fix thundering herd on endpoint cache invalidation (CASSANDRA-6345, 6485)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/39bdb2be/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/39bdb2be/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageService.java
index 0870362,c93ea5b..9eb4e92
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@@ -1452,6 -1453,12 +1452,12 @@@ public class StorageService extends Not
  
          tokens = getTokensFor(endpoint, pieces[1]);
  
+         Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
 -        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
++        Set<Token> tokensToUpdateInSystemKeyspace = new HashSet<Token>();
+         Set<Token> localTokensToRemove = new HashSet<Token>();
+         Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+ 
+ 
          if (logger.isDebugEnabled())
              logger.debug("Node " + endpoint + " state normal, token " + tokens);
  
@@@ -1465,14 -1473,35 +1472,34 @@@
              if (DatabaseDescriptor.isReplacing() && Gossiper.instance.getEndpointStateForEndpoint(DatabaseDescriptor.getReplaceAddress()) != null && (hostId.equals(Gossiper.instance.getHostId(DatabaseDescriptor.getReplaceAddress()))))
                  logger.warn("Not updating token metadata for {} because I am replacing it", endpoint);
              else
-                 tokenMetadata.updateHostId(hostId, endpoint);
+             {
+                 if (existing != null && !existing.equals(endpoint))
+                 {
+                     if (existing.equals(FBUtilities.getBroadcastAddress()))
+                     {
+                         logger.warn("Not updating host ID {} for {} because it's mine", hostId, endpoint);
+                         tokenMetadata.removeEndpoint(endpoint);
+                         endpointsToRemove.add(endpoint);
+                     }
+                     else if (Gossiper.instance.compareEndpointStartup(endpoint, existing) > 0)
+                     {
+                         logger.warn("Host ID collision for {} between {} and {}; {} is the new owner", hostId, existing, endpoint, endpoint);
+                         tokenMetadata.removeEndpoint(existing);
+                         endpointsToRemove.add(existing);
+                         tokenMetadata.updateHostId(hostId, endpoint);
+                     }
+                     else
+                     {
+                         logger.warn("Host ID Collision for {} between {} and {}; ignored {}", hostId, existing, endpoint, endpoint);
+                         tokenMetadata.removeEndpoint(endpoint);
+                         endpointsToRemove.add(endpoint);
+                     }
+                 }
+                 else
+                     tokenMetadata.updateHostId(hostId, endpoint);
+             }
 -
          }
  
-         Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
-         Set<Token> tokensToUpdateInSystemKeyspace = new HashSet<Token>();
-         Set<Token> localTokensToRemove = new HashSet<Token>();
-         Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
- 
          for (final Token token : tokens)
          {
              // we don't want to update if this node is responsible for the token and it has a later startup time than endpoint.


[5/6] git commit: Merge branch 'cassandra-1.2' into cassandra-2.0

Posted by br...@apache.org.
Merge branch 'cassandra-1.2' into cassandra-2.0

Conflicts:
	src/java/org/apache/cassandra/service/StorageService.java


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

Branch: refs/heads/cassandra-2.0
Commit: 39bdb2be978b490c9b64068a67e812c07b63dca2
Parents: b44683c 6c4333e
Author: Brandon Williams <br...@apache.org>
Authored: Wed Jan 29 17:35:22 2014 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Wed Jan 29 17:35:22 2014 -0600

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/39bdb2be/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 94eaa79,d88bb26..a059d84
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -28,29 -19,10 +28,30 @@@ Merged from 1.2
   * Add properties to adjust FD initial value and max interval (CASSANDRA-4375)
   * Fix preparing with batch and delete from collection (CASSANDRA-6607)
   * Fix ABSC reverse iterator's remove() method (CASSANDRA-6629)
+  * Handle host ID conflicts properly (CASSANDRA-6615)
  
  
 -1.2.13
 +2.0.4
 + * Allow removing snapshots of no-longer-existing CFs (CASSANDRA-6418)
 + * add StorageService.stopDaemon() (CASSANDRA-4268)
 + * add IRE for invalid CF supplied to get_count (CASSANDRA-5701)
 + * add client encryption support to sstableloader (CASSANDRA-6378)
 + * Fix accept() loop for SSL sockets post-shutdown (CASSANDRA-6468)
 + * Fix size-tiered compaction in LCS L0 (CASSANDRA-6496)
 + * Fix assertion failure in filterColdSSTables (CASSANDRA-6483)
 + * Fix row tombstones in larger-than-memory compactions (CASSANDRA-6008)
 + * Fix cleanup ClassCastException (CASSANDRA-6462)
 + * Reduce gossip memory use by interning VersionedValue strings (CASSANDRA-6410)
 + * Allow specifying datacenters to participate in a repair (CASSANDRA-6218)
 + * Fix divide-by-zero in PCI (CASSANDRA-6403)
 + * Fix setting last compacted key in the wrong level for LCS (CASSANDRA-6284)
 + * Add millisecond precision formats to the timestamp parser (CASSANDRA-6395)
 + * Expose a total memtable size metric for a CF (CASSANDRA-6391)
 + * cqlsh: handle symlinks properly (CASSANDRA-6425)
 + * Fix potential infinite loop when paging query with IN (CASSANDRA-6464)
 + * Fix assertion error in AbstractQueryPager.discardFirst (CASSANDRA-6447)
 + * Fix streaming older SSTable yields unnecessary tombstones (CASSANDRA-6527)
 +Merged from 1.2:
   * Improved error message on bad properties in DDL queries (CASSANDRA-6453)
   * Randomize batchlog candidates selection (CASSANDRA-6481)
   * Fix thundering herd on endpoint cache invalidation (CASSANDRA-6345, 6485)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/39bdb2be/src/java/org/apache/cassandra/gms/Gossiper.java
----------------------------------------------------------------------

http://git-wip-us.apache.org/repos/asf/cassandra/blob/39bdb2be/src/java/org/apache/cassandra/service/StorageService.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/service/StorageService.java
index 0870362,c93ea5b..9eb4e92
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@@ -1452,6 -1453,12 +1452,12 @@@ public class StorageService extends Not
  
          tokens = getTokensFor(endpoint, pieces[1]);
  
+         Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
 -        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
++        Set<Token> tokensToUpdateInSystemKeyspace = new HashSet<Token>();
+         Set<Token> localTokensToRemove = new HashSet<Token>();
+         Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+ 
+ 
          if (logger.isDebugEnabled())
              logger.debug("Node " + endpoint + " state normal, token " + tokens);
  
@@@ -1465,14 -1473,35 +1472,34 @@@
              if (DatabaseDescriptor.isReplacing() && Gossiper.instance.getEndpointStateForEndpoint(DatabaseDescriptor.getReplaceAddress()) != null && (hostId.equals(Gossiper.instance.getHostId(DatabaseDescriptor.getReplaceAddress()))))
                  logger.warn("Not updating token metadata for {} because I am replacing it", endpoint);
              else
-                 tokenMetadata.updateHostId(hostId, endpoint);
+             {
+                 if (existing != null && !existing.equals(endpoint))
+                 {
+                     if (existing.equals(FBUtilities.getBroadcastAddress()))
+                     {
+                         logger.warn("Not updating host ID {} for {} because it's mine", hostId, endpoint);
+                         tokenMetadata.removeEndpoint(endpoint);
+                         endpointsToRemove.add(endpoint);
+                     }
+                     else if (Gossiper.instance.compareEndpointStartup(endpoint, existing) > 0)
+                     {
+                         logger.warn("Host ID collision for {} between {} and {}; {} is the new owner", hostId, existing, endpoint, endpoint);
+                         tokenMetadata.removeEndpoint(existing);
+                         endpointsToRemove.add(existing);
+                         tokenMetadata.updateHostId(hostId, endpoint);
+                     }
+                     else
+                     {
+                         logger.warn("Host ID Collision for {} between {} and {}; ignored {}", hostId, existing, endpoint, endpoint);
+                         tokenMetadata.removeEndpoint(endpoint);
+                         endpointsToRemove.add(endpoint);
+                     }
+                 }
+                 else
+                     tokenMetadata.updateHostId(hostId, endpoint);
+             }
 -
          }
  
-         Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
-         Set<Token> tokensToUpdateInSystemKeyspace = new HashSet<Token>();
-         Set<Token> localTokensToRemove = new HashSet<Token>();
-         Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
- 
          for (final Token token : tokens)
          {
              // we don't want to update if this node is responsible for the token and it has a later startup time than endpoint.


[3/6] git commit: Handle host id conflicts properly. Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-6615

Posted by br...@apache.org.
Handle host id conflicts properly.
Patch by brandonwilliams, reviewed by Tyler Hobbs for CASSANDRA-6615


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

Branch: refs/heads/trunk
Commit: 6c4333e3d47dfe3fad9781e3c36a5c84476af1d3
Parents: 1d81765
Author: Brandon Williams <br...@apache.org>
Authored: Wed Jan 29 17:30:42 2014 -0600
Committer: Brandon Williams <br...@apache.org>
Committed: Wed Jan 29 17:31:45 2014 -0600

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


http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index 2920c15..d88bb26 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -19,6 +19,7 @@
  * Add properties to adjust FD initial value and max interval (CASSANDRA-4375)
  * Fix preparing with batch and delete from collection (CASSANDRA-6607)
  * Fix ABSC reverse iterator's remove() method (CASSANDRA-6629)
+ * Handle host ID conflicts properly (CASSANDRA-6615)
 
 
 1.2.13

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/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 3ed6cba..b51bbd3 100644
--- a/src/java/org/apache/cassandra/gms/Gossiper.java
+++ b/src/java/org/apache/cassandra/gms/Gossiper.java
@@ -596,7 +596,7 @@ public class Gossiper implements IFailureDetectionEventListener, GossiperMBean
         {
             return false;
         }
-        return !isDeadState(epState) && !epState.isAlive() && !StorageService.instance.getTokenMetadata().isMember(endpoint);
+        return !isDeadState(epState) && !StorageService.instance.getTokenMetadata().isMember(endpoint);
     }
 
     private void doStatusCheck()

http://git-wip-us.apache.org/repos/asf/cassandra/blob/6c4333e3/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 ab266d8..c93ea5b 100644
--- a/src/java/org/apache/cassandra/service/StorageService.java
+++ b/src/java/org/apache/cassandra/service/StorageService.java
@@ -1453,6 +1453,12 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
 
         tokens = getTokensFor(endpoint, pieces[1]);
 
+        Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
+        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
+        Set<Token> localTokensToRemove = new HashSet<Token>();
+        Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+
+
         if (logger.isDebugEnabled())
             logger.debug("Node " + endpoint + " state normal, token " + tokens);
 
@@ -1463,16 +1469,38 @@ public class StorageService extends NotificationBroadcasterSupport implements IE
         if (Gossiper.instance.usesHostId(endpoint))
         {
             UUID hostId = Gossiper.instance.getHostId(endpoint);
+            InetAddress existing = tokenMetadata.getEndpointForHostId(hostId);
             if (DatabaseDescriptor.isReplacing() && Gossiper.instance.getEndpointStateForEndpoint(DatabaseDescriptor.getReplaceAddress()) != null && (hostId.equals(Gossiper.instance.getHostId(DatabaseDescriptor.getReplaceAddress()))))
                 logger.warn("Not updating token metadata for {} because I am replacing it", endpoint);
             else
-                tokenMetadata.updateHostId(hostId, endpoint);
-        }
+            {
+                if (existing != null && !existing.equals(endpoint))
+                {
+                    if (existing.equals(FBUtilities.getBroadcastAddress()))
+                    {
+                        logger.warn("Not updating host ID {} for {} because it's mine", hostId, endpoint);
+                        tokenMetadata.removeEndpoint(endpoint);
+                        endpointsToRemove.add(endpoint);
+                    }
+                    else if (Gossiper.instance.compareEndpointStartup(endpoint, existing) > 0)
+                    {
+                        logger.warn("Host ID collision for {} between {} and {}; {} is the new owner", hostId, existing, endpoint, endpoint);
+                        tokenMetadata.removeEndpoint(existing);
+                        endpointsToRemove.add(existing);
+                        tokenMetadata.updateHostId(hostId, endpoint);
+                    }
+                    else
+                    {
+                        logger.warn("Host ID Collision for {} between {} and {}; ignored {}", hostId, existing, endpoint, endpoint);
+                        tokenMetadata.removeEndpoint(endpoint);
+                        endpointsToRemove.add(endpoint);
+                    }
+                }
+                else
+                    tokenMetadata.updateHostId(hostId, endpoint);
+            }
 
-        Set<Token> tokensToUpdateInMetadata = new HashSet<Token>();
-        Set<Token> tokensToUpdateInSystemTable = new HashSet<Token>();
-        Set<Token> localTokensToRemove = new HashSet<Token>();
-        Set<InetAddress> endpointsToRemove = new HashSet<InetAddress>();
+        }
 
         for (final Token token : tokens)
         {