Repository: cassandra
Updated Branches:
  refs/heads/cassandra-2.1 f25da979f -> c93765772


Avoid IAE in IndexSummaryManager while sorting sstables

Patch by Tyler Hobbs; reviewed by Benjamin Lerer for CASSANDRA-8182


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

Branch: refs/heads/cassandra-2.1
Commit: c93765772e97b5807fe037c7208b2a412ea9b3db
Parents: f25da97
Author: Tyler Hobbs <ty...@datastax.com>
Authored: Tue Oct 28 11:34:23 2014 -0500
Committer: Tyler Hobbs <ty...@datastax.com>
Committed: Tue Oct 28 11:34:23 2014 -0500

----------------------------------------------------------------------
 CHANGES.txt                                     |  2 +
 .../io/sstable/IndexSummaryManager.java         | 46 +++++++++++++-------
 2 files changed, 33 insertions(+), 15 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/cassandra/blob/c9376577/CHANGES.txt
----------------------------------------------------------------------
diff --git a/CHANGES.txt b/CHANGES.txt
index fbcf460..cdfd248 100644
--- a/CHANGES.txt
+++ b/CHANGES.txt
@@ -1,4 +1,6 @@
 2.1.2
+ * Avoid IllegalArgumentException while sorting sstables in
+   IndexSummaryManager (CASSANDRA-8182)
  * Shutdown JVM on file descriptor exhaustion (CASSANDRA-7579)
  * Add 'die' policy for commit log and disk failure (CASSANDRA-7927)
  * Fix installing as service on Windows (CASSANDRA-8115)

http://git-wip-us.apache.org/repos/asf/cassandra/blob/c9376577/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
----------------------------------------------------------------------
diff --git a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java 
b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
index e39d75d..cc60b4d 100644
--- a/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
+++ b/src/java/org/apache/cassandra/io/sstable/IndexSummaryManager.java
@@ -262,32 +262,22 @@ public class IndexSummaryManager implements 
IndexSummaryManagerMBean
         logger.debug("Beginning redistribution of index summaries for {} 
sstables with memory pool size {} MB; current spaced used is {} MB",
                      nonCompacting.size(), memoryPoolBytes / 1024L / 1024L, 
total / 1024.0 / 1024.0);
 
+        final Map<SSTableReader, Double> readRates = new 
HashMap<>(nonCompacting.size());
         double totalReadsPerSec = 0.0;
         for (SSTableReader sstable : nonCompacting)
         {
             if (sstable.readMeter != null)
             {
-                totalReadsPerSec += sstable.readMeter.fifteenMinuteRate();
+                Double readRate = sstable.readMeter.fifteenMinuteRate();
+                totalReadsPerSec += readRate;
+                readRates.put(sstable, readRate);
             }
         }
         logger.trace("Total reads/sec across all sstables in index summary 
resize process: {}", totalReadsPerSec);
 
         // copy and sort by read rates (ascending)
         List<SSTableReader> sstablesByHotness = new ArrayList<>(nonCompacting);
-        Collections.sort(sstablesByHotness, new Comparator<SSTableReader>()
-        {
-            public int compare(SSTableReader o1, SSTableReader o2)
-            {
-                if (o1.readMeter == null && o2.readMeter == null)
-                    return 0;
-                else if (o1.readMeter == null)
-                    return -1;
-                else if (o2.readMeter == null)
-                    return 1;
-                else
-                    return Double.compare(o1.readMeter.fifteenMinuteRate(), 
o2.readMeter.fifteenMinuteRate());
-            }
-        });
+        Collections.sort(sstablesByHotness, new ReadRateComparator(readRates));
 
         long remainingBytes = memoryPoolBytes;
         for (SSTableReader sstable : compacting)
@@ -485,4 +475,30 @@ public class IndexSummaryManager implements 
IndexSummaryManagerMBean
             this.newSamplingLevel = newSamplingLevel;
         }
     }
+
+    /** Utility class for sorting sstables by their read rates. */
+    private static class ReadRateComparator implements 
Comparator<SSTableReader>
+    {
+        private final Map<SSTableReader, Double> readRates;
+
+        public ReadRateComparator(Map<SSTableReader, Double> readRates)
+        {
+            this.readRates = readRates;
+        }
+
+        @Override
+        public int compare(SSTableReader o1, SSTableReader o2)
+        {
+            Double readRate1 = readRates.get(o1);
+            Double readRate2 = readRates.get(o2);
+            if (readRate1 == null && readRate2 == null)
+                return 0;
+            else if (readRate1 == null)
+                return -1;
+            else if (readRate2 == null)
+                return 1;
+            else
+                return Double.compare(readRate1, readRate2);
+        }
+    }
 }
\ No newline at end of file

Reply via email to