You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cassandra.apache.org by jb...@apache.org on 2013/09/30 20:53:57 UTC

[1/9] git commit: lock access to TM.endpointToHostIdMap patch by Mikhail Stepura; reviewed by jbellis for CASSANDRA-6103

Updated Branches:
  refs/heads/cassandra-1.2 898ce5f04 -> 672131d97
  refs/heads/cassandra-2.0 705e8d5a7 -> 65b1e36c7
  refs/heads/trunk ef3935741 -> 17c7e9486


lock access to TM.endpointToHostIdMap
patch by Mikhail Stepura; reviewed by jbellis for CASSANDRA-6103


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

Branch: refs/heads/cassandra-1.2
Commit: d73380e319c663d5bff23a7730dcf97cbd323970
Parents: 898ce5f
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:49:15 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:51:55 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/locator/TokenMetadata.java | 97 ++++++++++++++++----
 2 files changed, 78 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d73380e3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index ca559b1..6a695e1 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.2.11
+ * lock access to TM.endpointToHostIdMap (CASSANDRA-6103)
  * Allow estimated memtable size to exceed slab allocator size (CASSANDRA-6078)
  * Start MeteredFlusher earlier to prevent OOM during CL replay (CASSANDRA-6087)
  * Avoid sending Truncate command to fat clients (CASSANDRA-6088)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d73380e3/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 1f6682b..7ad711f 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -221,43 +221,76 @@ public class TokenMetadata
         assert hostId != null;
         assert endpoint != null;
 
-        InetAddress storedEp = endpointToHostIdMap.inverse().get(hostId);
-        if (storedEp != null)
+        lock.writeLock().lock();
+        try
         {
-            if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+            InetAddress storedEp = endpointToHostIdMap.inverse().get(hostId);
+            if (storedEp != null)
             {
-                throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
-                                                         storedEp,
-                                                         endpoint,
-                                                         hostId));
+                if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+                {
+                    throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
+                                                             storedEp,
+                                                             endpoint,
+                                                             hostId));
+                }
             }
+    
+            UUID storedId = endpointToHostIdMap.get(endpoint);
+            if ((storedId != null) && (!storedId.equals(hostId)))
+                logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
+    
+            endpointToHostIdMap.forcePut(endpoint, hostId);
+        }
+        finally
+        {
+            lock.writeLock().unlock();
         }
 
-        UUID storedId = endpointToHostIdMap.get(endpoint);
-        if ((storedId != null) && (!storedId.equals(hostId)))
-            logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
-
-        endpointToHostIdMap.forcePut(endpoint, hostId);
     }
 
     /** Return the unique host ID for an end-point. */
     public UUID getHostId(InetAddress endpoint)
     {
-        return endpointToHostIdMap.get(endpoint);
+        lock.readLock().lock();
+        try
+        {
+            return endpointToHostIdMap.get(endpoint);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** Return the end-point for a unique host ID */
     public InetAddress getEndpointForHostId(UUID hostId)
     {
-        return endpointToHostIdMap.inverse().get(hostId);
+        lock.readLock().lock();
+        try
+        {
+            return endpointToHostIdMap.inverse().get(hostId);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** @return a copy of the endpoint-to-id map for read-only operations */
     public Map<InetAddress, UUID> getEndpointToHostIdMapForReading()
     {
-        Map<InetAddress, UUID> readMap = new HashMap<InetAddress, UUID>();
-        readMap.putAll(endpointToHostIdMap);
-        return readMap;
+        lock.readLock().lock();
+        try
+        {
+            Map<InetAddress, UUID> readMap = new HashMap<InetAddress, UUID>();
+            readMap.putAll(endpointToHostIdMap);
+            return readMap;
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     @Deprecated
@@ -725,13 +758,29 @@ public class TokenMetadata
 
     public Set<InetAddress> getAllEndpoints()
     {
-        return endpointToHostIdMap.keySet();
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(endpointToHostIdMap.keySet());
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** caller should not modify leavingEndpoints */
     public Set<InetAddress> getLeavingEndpoints()
     {
-        return leavingEndpoints;
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(leavingEndpoints);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /**
@@ -740,7 +789,15 @@ public class TokenMetadata
      */
     public Set<Pair<Token, InetAddress>> getMovingEndpoints()
     {
-        return movingEndpoints;
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(movingEndpoints);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /**


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

Posted by jb...@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/17c7e948
Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/17c7e948
Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/17c7e948

Branch: refs/heads/trunk
Commit: 17c7e9486a3608b5507cc4718e25a9fbe1b2fbaf
Parents: ef39357 65b1e36
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:53:47 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:53:47 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 .../apache/cassandra/locator/TokenMetadata.java | 109 ++++++++++++++-----
 2 files changed, 85 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


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


[7/9] git commit: merge from 1.2

Posted by jb...@apache.org.
merge from 1.2


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

Branch: refs/heads/cassandra-2.0
Commit: 65b1e36c7853694275721c6bac1e705e61ee79ef
Parents: 705e8d5 672131d
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:53:43 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:53:43 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 .../apache/cassandra/locator/TokenMetadata.java | 109 ++++++++++++++-----
 2 files changed, 85 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/65b1e36c/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 33268dd,6a695e1..465c718
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,16 -1,5 +1,17 @@@
 -1.2.11
 +2.0.2
 + * Track and persist sstable read activity (CASSANDRA-5515)
 + * Fixes for speculative retry (CASSANDRA-5932)
 + * Improve memory usage of metadata min/max column names (CASSANDRA-6077)
 + * Fix thrift validation refusing row markers on CQL3 tables (CASSANDRA-6081)
 + * Fix insertion of collections with CAS (CASSANDRA-6069)
 + * Correctly send metadata on SELECT COUNT (CASSANDRA-6080)
 + * Track clients' remote addresses in ClientState (CASSANDRA-6070)
 + * Create snapshot dir if it does not exist when migrating
 +   leveled manifest (CASSANDRA-6093)
 + * make sequential nodetool repair the default (CASSANDRA-5950)
 + * Add more hooks for compaction strategy implementations (CASSANDRA-6111)
 +Merged from 1.2:
+  * lock access to TM.endpointToHostIdMap (CASSANDRA-6103)
   * Allow estimated memtable size to exceed slab allocator size (CASSANDRA-6078)
   * Start MeteredFlusher earlier to prevent OOM during CL replay (CASSANDRA-6087)
   * Avoid sending Truncate command to fat clients (CASSANDRA-6088)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/65b1e36c/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/locator/TokenMetadata.java
index 2ede042,ac9a1d0..addd662
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@@ -945,11 -1006,9 +1006,9 @@@ public class TokenMetadat
      /**
       * @deprecated retained for benefit of old tests
       */
 -    public Collection<InetAddress> getWriteEndpoints(Token token, String table, Collection<InetAddress> naturalEndpoints)
 +    public Collection<InetAddress> getWriteEndpoints(Token token, String keyspaceName, Collection<InetAddress> naturalEndpoints)
      {
-         ArrayList<InetAddress> endpoints = new ArrayList<InetAddress>();
-         Iterables.addAll(endpoints, Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, keyspaceName)));
-         return endpoints;
 -        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
++        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, keyspaceName)));
      }
  
      /** @return an endpoint to token multimap representation of tokenToEndpointMap (a copy) */


[3/9] git commit: lock access to TM.endpointToHostIdMap patch by Mikhail Stepura; reviewed by jbellis for CASSANDRA-6103

Posted by jb...@apache.org.
lock access to TM.endpointToHostIdMap
patch by Mikhail Stepura; reviewed by jbellis for CASSANDRA-6103


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

Branch: refs/heads/trunk
Commit: d73380e319c663d5bff23a7730dcf97cbd323970
Parents: 898ce5f
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:49:15 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:51:55 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/locator/TokenMetadata.java | 97 ++++++++++++++++----
 2 files changed, 78 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d73380e3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index ca559b1..6a695e1 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.2.11
+ * lock access to TM.endpointToHostIdMap (CASSANDRA-6103)
  * Allow estimated memtable size to exceed slab allocator size (CASSANDRA-6078)
  * Start MeteredFlusher earlier to prevent OOM during CL replay (CASSANDRA-6087)
  * Avoid sending Truncate command to fat clients (CASSANDRA-6088)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d73380e3/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 1f6682b..7ad711f 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -221,43 +221,76 @@ public class TokenMetadata
         assert hostId != null;
         assert endpoint != null;
 
-        InetAddress storedEp = endpointToHostIdMap.inverse().get(hostId);
-        if (storedEp != null)
+        lock.writeLock().lock();
+        try
         {
-            if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+            InetAddress storedEp = endpointToHostIdMap.inverse().get(hostId);
+            if (storedEp != null)
             {
-                throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
-                                                         storedEp,
-                                                         endpoint,
-                                                         hostId));
+                if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+                {
+                    throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
+                                                             storedEp,
+                                                             endpoint,
+                                                             hostId));
+                }
             }
+    
+            UUID storedId = endpointToHostIdMap.get(endpoint);
+            if ((storedId != null) && (!storedId.equals(hostId)))
+                logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
+    
+            endpointToHostIdMap.forcePut(endpoint, hostId);
+        }
+        finally
+        {
+            lock.writeLock().unlock();
         }
 
-        UUID storedId = endpointToHostIdMap.get(endpoint);
-        if ((storedId != null) && (!storedId.equals(hostId)))
-            logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
-
-        endpointToHostIdMap.forcePut(endpoint, hostId);
     }
 
     /** Return the unique host ID for an end-point. */
     public UUID getHostId(InetAddress endpoint)
     {
-        return endpointToHostIdMap.get(endpoint);
+        lock.readLock().lock();
+        try
+        {
+            return endpointToHostIdMap.get(endpoint);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** Return the end-point for a unique host ID */
     public InetAddress getEndpointForHostId(UUID hostId)
     {
-        return endpointToHostIdMap.inverse().get(hostId);
+        lock.readLock().lock();
+        try
+        {
+            return endpointToHostIdMap.inverse().get(hostId);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** @return a copy of the endpoint-to-id map for read-only operations */
     public Map<InetAddress, UUID> getEndpointToHostIdMapForReading()
     {
-        Map<InetAddress, UUID> readMap = new HashMap<InetAddress, UUID>();
-        readMap.putAll(endpointToHostIdMap);
-        return readMap;
+        lock.readLock().lock();
+        try
+        {
+            Map<InetAddress, UUID> readMap = new HashMap<InetAddress, UUID>();
+            readMap.putAll(endpointToHostIdMap);
+            return readMap;
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     @Deprecated
@@ -725,13 +758,29 @@ public class TokenMetadata
 
     public Set<InetAddress> getAllEndpoints()
     {
-        return endpointToHostIdMap.keySet();
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(endpointToHostIdMap.keySet());
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** caller should not modify leavingEndpoints */
     public Set<InetAddress> getLeavingEndpoints()
     {
-        return leavingEndpoints;
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(leavingEndpoints);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /**
@@ -740,7 +789,15 @@ public class TokenMetadata
      */
     public Set<Pair<Token, InetAddress>> getMovingEndpoints()
     {
-        return movingEndpoints;
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(movingEndpoints);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /**


[2/9] git commit: lock access to TM.endpointToHostIdMap patch by Mikhail Stepura; reviewed by jbellis for CASSANDRA-6103

Posted by jb...@apache.org.
lock access to TM.endpointToHostIdMap
patch by Mikhail Stepura; reviewed by jbellis for CASSANDRA-6103


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

Branch: refs/heads/cassandra-2.0
Commit: d73380e319c663d5bff23a7730dcf97cbd323970
Parents: 898ce5f
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:49:15 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:51:55 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  1 +
 .../apache/cassandra/locator/TokenMetadata.java | 97 ++++++++++++++++----
 2 files changed, 78 insertions(+), 20 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/d73380e3/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index ca559b1..6a695e1 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,5 @@
 1.2.11
+ * lock access to TM.endpointToHostIdMap (CASSANDRA-6103)
  * Allow estimated memtable size to exceed slab allocator size (CASSANDRA-6078)
  * Start MeteredFlusher earlier to prevent OOM during CL replay (CASSANDRA-6087)
  * Avoid sending Truncate command to fat clients (CASSANDRA-6088)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/d73380e3/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 1f6682b..7ad711f 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -221,43 +221,76 @@ public class TokenMetadata
         assert hostId != null;
         assert endpoint != null;
 
-        InetAddress storedEp = endpointToHostIdMap.inverse().get(hostId);
-        if (storedEp != null)
+        lock.writeLock().lock();
+        try
         {
-            if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+            InetAddress storedEp = endpointToHostIdMap.inverse().get(hostId);
+            if (storedEp != null)
             {
-                throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
-                                                         storedEp,
-                                                         endpoint,
-                                                         hostId));
+                if (!storedEp.equals(endpoint) && (FailureDetector.instance.isAlive(storedEp)))
+                {
+                    throw new RuntimeException(String.format("Host ID collision between active endpoint %s and %s (id=%s)",
+                                                             storedEp,
+                                                             endpoint,
+                                                             hostId));
+                }
             }
+    
+            UUID storedId = endpointToHostIdMap.get(endpoint);
+            if ((storedId != null) && (!storedId.equals(hostId)))
+                logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
+    
+            endpointToHostIdMap.forcePut(endpoint, hostId);
+        }
+        finally
+        {
+            lock.writeLock().unlock();
         }
 
-        UUID storedId = endpointToHostIdMap.get(endpoint);
-        if ((storedId != null) && (!storedId.equals(hostId)))
-            logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
-
-        endpointToHostIdMap.forcePut(endpoint, hostId);
     }
 
     /** Return the unique host ID for an end-point. */
     public UUID getHostId(InetAddress endpoint)
     {
-        return endpointToHostIdMap.get(endpoint);
+        lock.readLock().lock();
+        try
+        {
+            return endpointToHostIdMap.get(endpoint);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** Return the end-point for a unique host ID */
     public InetAddress getEndpointForHostId(UUID hostId)
     {
-        return endpointToHostIdMap.inverse().get(hostId);
+        lock.readLock().lock();
+        try
+        {
+            return endpointToHostIdMap.inverse().get(hostId);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** @return a copy of the endpoint-to-id map for read-only operations */
     public Map<InetAddress, UUID> getEndpointToHostIdMapForReading()
     {
-        Map<InetAddress, UUID> readMap = new HashMap<InetAddress, UUID>();
-        readMap.putAll(endpointToHostIdMap);
-        return readMap;
+        lock.readLock().lock();
+        try
+        {
+            Map<InetAddress, UUID> readMap = new HashMap<InetAddress, UUID>();
+            readMap.putAll(endpointToHostIdMap);
+            return readMap;
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     @Deprecated
@@ -725,13 +758,29 @@ public class TokenMetadata
 
     public Set<InetAddress> getAllEndpoints()
     {
-        return endpointToHostIdMap.keySet();
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(endpointToHostIdMap.keySet());
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /** caller should not modify leavingEndpoints */
     public Set<InetAddress> getLeavingEndpoints()
     {
-        return leavingEndpoints;
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(leavingEndpoints);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /**
@@ -740,7 +789,15 @@ public class TokenMetadata
      */
     public Set<Pair<Token, InetAddress>> getMovingEndpoints()
     {
-        return movingEndpoints;
+        lock.readLock().lock();
+        try
+        {
+            return new HashSet<>(movingEndpoints);
+        }
+        finally
+        {
+            lock.readLock().unlock();
+        }
     }
 
     /**


[6/9] git commit: cleanup

Posted by jb...@apache.org.
cleanup


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

Branch: refs/heads/trunk
Commit: 672131d97fe31a7c724a236fc4f040d4c241769d
Parents: d73380e
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:52:09 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:52:09 2013 -0500

----------------------------------------------------------------------
 .../apache/cassandra/locator/TokenMetadata.java | 22 +++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/672131d9/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 7ad711f..ac9a1d0 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -45,10 +45,14 @@ public class TokenMetadata
 {
     private static final Logger logger = LoggerFactory.getLogger(TokenMetadata.class);
 
-    /* Maintains token to endpoint map of every node in the cluster. */
+    /**
+     * Maintains token to endpoint map of every node in the cluster.
+     * Each Token is associated with exactly one Address, but each Address may have
+     * multiple tokens.  Hence, the BiMultiValMap collection.
+     */
     private final BiMultiValMap<Token, InetAddress> tokenToEndpointMap;
 
-    /* Maintains endpoint to host ID map of every node in the cluster */
+    /** Maintains endpoint to host ID map of every node in the cluster */
     private final BiMap<InetAddress, UUID> endpointToHostIdMap;
 
     // Prior to CASSANDRA-603, we just had <tt>Map<Range, InetAddress> pendingRanges<tt>,
@@ -235,10 +239,10 @@ public class TokenMetadata
                                                              hostId));
                 }
             }
-    
+
             UUID storedId = endpointToHostIdMap.get(endpoint);
             if ((storedId != null) && (!storedId.equals(hostId)))
-                logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
+                logger.warn("Changing {}'s host ID from {} to {}", endpoint, storedId, hostId);
     
             endpointToHostIdMap.forcePut(endpoint, hostId);
         }
@@ -761,7 +765,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(endpointToHostIdMap.keySet());
+            return ImmutableSet.copyOf(endpointToHostIdMap.keySet());
         }
         finally
         {
@@ -775,7 +779,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(leavingEndpoints);
+            return ImmutableSet.copyOf(leavingEndpoints);
         }
         finally
         {
@@ -792,7 +796,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(movingEndpoints);
+            return ImmutableSet.copyOf(movingEndpoints);
         }
         finally
         {
@@ -1004,9 +1008,7 @@ public class TokenMetadata
      */
     public Collection<InetAddress> getWriteEndpoints(Token token, String table, Collection<InetAddress> naturalEndpoints)
     {
-        ArrayList<InetAddress> endpoints = new ArrayList<InetAddress>();
-        Iterables.addAll(endpoints, Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
-        return endpoints;
+        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
     }
 
     /** @return an endpoint to token multimap representation of tokenToEndpointMap (a copy) */


[8/9] git commit: merge from 1.2

Posted by jb...@apache.org.
merge from 1.2


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

Branch: refs/heads/trunk
Commit: 65b1e36c7853694275721c6bac1e705e61ee79ef
Parents: 705e8d5 672131d
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:53:43 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:53:43 2013 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |   1 +
 .../apache/cassandra/locator/TokenMetadata.java | 109 ++++++++++++++-----
 2 files changed, 85 insertions(+), 25 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/65b1e36c/CHANGES.txt
----------------------------------------------------------------------
diff --cc CHANGES.txt
index 33268dd,6a695e1..465c718
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@@ -1,16 -1,5 +1,17 @@@
 -1.2.11
 +2.0.2
 + * Track and persist sstable read activity (CASSANDRA-5515)
 + * Fixes for speculative retry (CASSANDRA-5932)
 + * Improve memory usage of metadata min/max column names (CASSANDRA-6077)
 + * Fix thrift validation refusing row markers on CQL3 tables (CASSANDRA-6081)
 + * Fix insertion of collections with CAS (CASSANDRA-6069)
 + * Correctly send metadata on SELECT COUNT (CASSANDRA-6080)
 + * Track clients' remote addresses in ClientState (CASSANDRA-6070)
 + * Create snapshot dir if it does not exist when migrating
 +   leveled manifest (CASSANDRA-6093)
 + * make sequential nodetool repair the default (CASSANDRA-5950)
 + * Add more hooks for compaction strategy implementations (CASSANDRA-6111)
 +Merged from 1.2:
+  * lock access to TM.endpointToHostIdMap (CASSANDRA-6103)
   * Allow estimated memtable size to exceed slab allocator size (CASSANDRA-6078)
   * Start MeteredFlusher earlier to prevent OOM during CL replay (CASSANDRA-6087)
   * Avoid sending Truncate command to fat clients (CASSANDRA-6088)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/65b1e36c/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --cc src/java/org/apache/cassandra/locator/TokenMetadata.java
index 2ede042,ac9a1d0..addd662
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@@ -945,11 -1006,9 +1006,9 @@@ public class TokenMetadat
      /**
       * @deprecated retained for benefit of old tests
       */
 -    public Collection<InetAddress> getWriteEndpoints(Token token, String table, Collection<InetAddress> naturalEndpoints)
 +    public Collection<InetAddress> getWriteEndpoints(Token token, String keyspaceName, Collection<InetAddress> naturalEndpoints)
      {
-         ArrayList<InetAddress> endpoints = new ArrayList<InetAddress>();
-         Iterables.addAll(endpoints, Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, keyspaceName)));
-         return endpoints;
 -        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
++        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, keyspaceName)));
      }
  
      /** @return an endpoint to token multimap representation of tokenToEndpointMap (a copy) */


[4/9] git commit: cleanup

Posted by jb...@apache.org.
cleanup


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

Branch: refs/heads/cassandra-1.2
Commit: 672131d97fe31a7c724a236fc4f040d4c241769d
Parents: d73380e
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:52:09 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:52:09 2013 -0500

----------------------------------------------------------------------
 .../apache/cassandra/locator/TokenMetadata.java | 22 +++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/672131d9/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 7ad711f..ac9a1d0 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -45,10 +45,14 @@ public class TokenMetadata
 {
     private static final Logger logger = LoggerFactory.getLogger(TokenMetadata.class);
 
-    /* Maintains token to endpoint map of every node in the cluster. */
+    /**
+     * Maintains token to endpoint map of every node in the cluster.
+     * Each Token is associated with exactly one Address, but each Address may have
+     * multiple tokens.  Hence, the BiMultiValMap collection.
+     */
     private final BiMultiValMap<Token, InetAddress> tokenToEndpointMap;
 
-    /* Maintains endpoint to host ID map of every node in the cluster */
+    /** Maintains endpoint to host ID map of every node in the cluster */
     private final BiMap<InetAddress, UUID> endpointToHostIdMap;
 
     // Prior to CASSANDRA-603, we just had <tt>Map<Range, InetAddress> pendingRanges<tt>,
@@ -235,10 +239,10 @@ public class TokenMetadata
                                                              hostId));
                 }
             }
-    
+
             UUID storedId = endpointToHostIdMap.get(endpoint);
             if ((storedId != null) && (!storedId.equals(hostId)))
-                logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
+                logger.warn("Changing {}'s host ID from {} to {}", endpoint, storedId, hostId);
     
             endpointToHostIdMap.forcePut(endpoint, hostId);
         }
@@ -761,7 +765,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(endpointToHostIdMap.keySet());
+            return ImmutableSet.copyOf(endpointToHostIdMap.keySet());
         }
         finally
         {
@@ -775,7 +779,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(leavingEndpoints);
+            return ImmutableSet.copyOf(leavingEndpoints);
         }
         finally
         {
@@ -792,7 +796,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(movingEndpoints);
+            return ImmutableSet.copyOf(movingEndpoints);
         }
         finally
         {
@@ -1004,9 +1008,7 @@ public class TokenMetadata
      */
     public Collection<InetAddress> getWriteEndpoints(Token token, String table, Collection<InetAddress> naturalEndpoints)
     {
-        ArrayList<InetAddress> endpoints = new ArrayList<InetAddress>();
-        Iterables.addAll(endpoints, Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
-        return endpoints;
+        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
     }
 
     /** @return an endpoint to token multimap representation of tokenToEndpointMap (a copy) */


[5/9] git commit: cleanup

Posted by jb...@apache.org.
cleanup


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

Branch: refs/heads/cassandra-2.0
Commit: 672131d97fe31a7c724a236fc4f040d4c241769d
Parents: d73380e
Author: Jonathan Ellis <jb...@apache.org>
Authored: Mon Sep 30 13:52:09 2013 -0500
Committer: Jonathan Ellis <jb...@apache.org>
Committed: Mon Sep 30 13:52:09 2013 -0500

----------------------------------------------------------------------
 .../apache/cassandra/locator/TokenMetadata.java | 22 +++++++++++---------
 1 file changed, 12 insertions(+), 10 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/672131d9/src/java/org/apache/cassandra/locator/TokenMetadata.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/locator/TokenMetadata.java b/src/java/org/apache/cassandra/locator/TokenMetadata.java
index 7ad711f..ac9a1d0 100644
--- a/src/java/org/apache/cassandra/locator/TokenMetadata.java
+++ b/src/java/org/apache/cassandra/locator/TokenMetadata.java
@@ -45,10 +45,14 @@ public class TokenMetadata
 {
     private static final Logger logger = LoggerFactory.getLogger(TokenMetadata.class);
 
-    /* Maintains token to endpoint map of every node in the cluster. */
+    /**
+     * Maintains token to endpoint map of every node in the cluster.
+     * Each Token is associated with exactly one Address, but each Address may have
+     * multiple tokens.  Hence, the BiMultiValMap collection.
+     */
     private final BiMultiValMap<Token, InetAddress> tokenToEndpointMap;
 
-    /* Maintains endpoint to host ID map of every node in the cluster */
+    /** Maintains endpoint to host ID map of every node in the cluster */
     private final BiMap<InetAddress, UUID> endpointToHostIdMap;
 
     // Prior to CASSANDRA-603, we just had <tt>Map<Range, InetAddress> pendingRanges<tt>,
@@ -235,10 +239,10 @@ public class TokenMetadata
                                                              hostId));
                 }
             }
-    
+
             UUID storedId = endpointToHostIdMap.get(endpoint);
             if ((storedId != null) && (!storedId.equals(hostId)))
-                logger.warn("Changing {}'s host ID from {} to {}", new Object[] {endpoint, storedId, hostId});
+                logger.warn("Changing {}'s host ID from {} to {}", endpoint, storedId, hostId);
     
             endpointToHostIdMap.forcePut(endpoint, hostId);
         }
@@ -761,7 +765,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(endpointToHostIdMap.keySet());
+            return ImmutableSet.copyOf(endpointToHostIdMap.keySet());
         }
         finally
         {
@@ -775,7 +779,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(leavingEndpoints);
+            return ImmutableSet.copyOf(leavingEndpoints);
         }
         finally
         {
@@ -792,7 +796,7 @@ public class TokenMetadata
         lock.readLock().lock();
         try
         {
-            return new HashSet<>(movingEndpoints);
+            return ImmutableSet.copyOf(movingEndpoints);
         }
         finally
         {
@@ -1004,9 +1008,7 @@ public class TokenMetadata
      */
     public Collection<InetAddress> getWriteEndpoints(Token token, String table, Collection<InetAddress> naturalEndpoints)
     {
-        ArrayList<InetAddress> endpoints = new ArrayList<InetAddress>();
-        Iterables.addAll(endpoints, Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
-        return endpoints;
+        return ImmutableList.copyOf(Iterables.concat(naturalEndpoints, pendingEndpointsFor(token, table)));
     }
 
     /** @return an endpoint to token multimap representation of tokenToEndpointMap (a copy) */