Author: brandonwilliams
Date: Tue Dec 28 21:43:45 2010
New Revision: 1053450

URL: http://svn.apache.org/viewvc?rev=1053450&view=rev
Log:
Avoid synchronization in getPendingRanges and unecessarily calling it
twice.
Patch by brandonwilliams, reviewed by jbellis for CASSANDRA-1370

Modified:
    
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/TokenMetadata.java

Modified: 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/TokenMetadata.java
URL: 
http://svn.apache.org/viewvc/cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/TokenMetadata.java?rev=1053450&r1=1053449&r2=1053450&view=diff
==============================================================================
--- 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/TokenMetadata.java
 (original)
+++ 
cassandra/branches/cassandra-0.7/src/java/org/apache/cassandra/locator/TokenMetadata.java
 Tue Dec 28 21:43:45 2010
@@ -323,13 +323,15 @@ public class TokenMetadata
         }
     }
 
-    private synchronized Multimap<Range, InetAddress> 
getPendingRangesMM(String table)
+    private Multimap<Range, InetAddress> getPendingRangesMM(String table)
     {
         Multimap<Range, InetAddress> map = pendingRanges.get(table);
         if (map == null)
         {
-             map = HashMultimap.create();
-            pendingRanges.put(table, map);
+            map = HashMultimap.create();
+            Multimap<Range, InetAddress> priorMap = 
pendingRanges.putIfAbsent(table, map);
+            if (priorMap != null)
+                map = priorMap;
         }
         return map;
     }
@@ -556,12 +558,13 @@ public class TokenMetadata
      */
     public Collection<InetAddress> getWriteEndpoints(Token token, String 
table, Collection<InetAddress> naturalEndpoints)
     {
-        if (getPendingRanges(table).isEmpty())
+        Map<Range, Collection<InetAddress>> ranges = getPendingRanges(table);
+        if (ranges.isEmpty())
             return naturalEndpoints;
 
         List<InetAddress> endpoints = new 
ArrayList<InetAddress>(naturalEndpoints);
 
-        for (Map.Entry<Range, Collection<InetAddress>> entry : 
getPendingRanges(table).entrySet())
+        for (Map.Entry<Range, Collection<InetAddress>> entry : 
ranges.entrySet())
         {
             if (entry.getKey().contains(token))
             {


Reply via email to