Repository: cassandra
Updated Branches:
  refs/heads/cassandra-3.0 299782cff -> 5c4ce600c
  refs/heads/cassandra-3.11 991e19711 -> 68f8966d5
  refs/heads/trunk f5adeeb8d -> ffde38a25


Improve TokenMetaData cache populating performance avoid long locking

patch by Pengchao Wang; reviewed by Benedict for CASSANDRA-14660


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

Branch: refs/heads/cassandra-3.0
Commit: 5c4ce600c4e24a656fd538f14ec5f4951d231e6e
Parents: 299782c
Author: Pengchao Wang <[email protected]>
Authored: Fri Aug 24 00:39:06 2018 -0700
Committer: Benedict Elliott Smith <[email protected]>
Committed: Fri Aug 24 15:47:08 2018 +0100

----------------------------------------------------------------------
 .../cassandra/utils/SortedBiMultiValMap.java    | 29 ++++++++++++--------
 1 file changed, 17 insertions(+), 12 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/5c4ce600/src/java/org/apache/cassandra/utils/SortedBiMultiValMap.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/utils/SortedBiMultiValMap.java 
b/src/java/org/apache/cassandra/utils/SortedBiMultiValMap.java
index 368d3f5..f628061 100644
--- a/src/java/org/apache/cassandra/utils/SortedBiMultiValMap.java
+++ b/src/java/org/apache/cassandra/utils/SortedBiMultiValMap.java
@@ -17,6 +17,7 @@
  */
 package org.apache.cassandra.utils;
 
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -26,6 +27,9 @@ import com.google.common.collect.TreeMultimap;
 
 public class SortedBiMultiValMap<K, V> extends BiMultiValMap<K, V>
 {
+    @SuppressWarnings("unchecked")
+    private static final Comparator DEFAULT_COMPARATOR = (o1, o2) -> 
((Comparable) o1).compareTo(o2);
+
     protected SortedBiMultiValMap(SortedMap<K, V> forwardMap, 
SortedSetMultimap<V, K> reverseMap)
     {
         super(forwardMap, reverseMap);
@@ -48,28 +52,29 @@ public class SortedBiMultiValMap<K, V> extends 
BiMultiValMap<K, V>
     public static <K extends Comparable<K>, V extends Comparable<V>> 
SortedBiMultiValMap<K, V> create(BiMultiValMap<K, V> map)
     {
         SortedBiMultiValMap<K, V> newMap = SortedBiMultiValMap.<K,V>create();
-        newMap.forwardMap.putAll(map);
-        newMap.reverseMap.putAll(map.inverse());
+        copy(map, newMap);
         return newMap;
     }
 
     public static <K, V> SortedBiMultiValMap<K, V> create(BiMultiValMap<K, V> 
map, Comparator<K> keyComparator, Comparator<V> valueComparator)
     {
         SortedBiMultiValMap<K, V> newMap = create(keyComparator, 
valueComparator);
-        newMap.forwardMap.putAll(map);
-        newMap.reverseMap.putAll(map.inverse());
+        copy(map, newMap);
         return newMap;
     }
 
+    private static <K, V> void copy(BiMultiValMap<K, V> map, BiMultiValMap<K, 
V> newMap)
+    {
+        newMap.forwardMap.putAll(map);
+        // Put each individual TreeSet instead of Multimap#putAll(Multimap) to 
get linear complexity
+        // See CASSANDRA-14660
+        for (Entry<V, Collection<K>> entry : map.inverse().asMap().entrySet())
+            newMap.reverseMap.putAll(entry.getKey(), entry.getValue());
+    }
+
+    @SuppressWarnings("unchecked")
     private static <T> Comparator<T> defaultComparator()
     {
-        return new Comparator<T>()
-        {
-            @SuppressWarnings("unchecked")
-            public int compare(T o1, T o2)
-            {
-                return ((Comparable<T>) o1).compareTo(o2);
-            }
-        };
+        return DEFAULT_COMPARATOR;
     }
 }


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to