Updated Branches: refs/heads/trunk bcbcff3e6 -> c7af3040c
simplify SizeTieredCompactionStrategy, and reduce allocations patch by dbrosius reviewed by jbellis for cassandra-6138 Project: http://git-wip-us.apache.org/repos/asf/cassandra/repo Commit: http://git-wip-us.apache.org/repos/asf/cassandra/commit/c7af3040 Tree: http://git-wip-us.apache.org/repos/asf/cassandra/tree/c7af3040 Diff: http://git-wip-us.apache.org/repos/asf/cassandra/diff/c7af3040 Branch: refs/heads/trunk Commit: c7af3040c6ecd7a7fa7288ac56ba0c7fe0602e40 Parents: bcbcff3 Author: Dave Brosius <[email protected]> Authored: Wed Oct 2 22:59:56 2013 -0400 Committer: Dave Brosius <[email protected]> Committed: Wed Oct 2 22:59:56 2013 -0400 ---------------------------------------------------------------------- .../SizeTieredCompactionStrategy.java | 50 +++++++++++--------- 1 file changed, 27 insertions(+), 23 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/cassandra/blob/c7af3040/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java ---------------------------------------------------------------------- diff --git a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java index cee5f97..61f5668 100644 --- a/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java +++ b/src/java/org/apache/cassandra/db/compaction/SizeTieredCompactionStrategy.java @@ -34,6 +34,30 @@ import org.apache.cassandra.utils.Pair; public class SizeTieredCompactionStrategy extends AbstractCompactionStrategy { private static final Logger logger = LoggerFactory.getLogger(SizeTieredCompactionStrategy.class); + + private static Comparator<SSTableReader> generationComparator = new Comparator<SSTableReader>() + { + public int compare(SSTableReader o1, SSTableReader o2) + { + return o1.descriptor.generation - o2.descriptor.generation; + } + }; + + private static Comparator<List<SSTableReader>> avgBucketSizeComparator = new Comparator<List<SSTableReader>>() + { + public int compare(List<SSTableReader> o1, List<SSTableReader> o2) + { + return Longs.compare(avgSize(o1), avgSize(o2)); + } + + private long avgSize(List<SSTableReader> sstables) + { + long n = 0; + for (SSTableReader sstable : sstables) + n += sstable.bytesOnDisk(); + return n / sstables.size(); + } + }; protected SizeTieredCompactionStrategyOptions options; protected volatile int estimatedRemainingTasks; @@ -86,35 +110,15 @@ public class SizeTieredCompactionStrategy extends AbstractCompactionStrategy if (bucket.size() < minThreshold) continue; - Collections.sort(bucket, new Comparator<SSTableReader>() - { - public int compare(SSTableReader o1, SSTableReader o2) - { - return o1.descriptor.generation - o2.descriptor.generation; - } - }); + Collections.sort(bucket, generationComparator); List<SSTableReader> prunedBucket = bucket.subList(0, Math.min(bucket.size(), maxThreshold)); prunedBuckets.add(prunedBucket); } if (prunedBuckets.isEmpty()) return Collections.emptyList(); - + // prefer compacting buckets with smallest average size; that will yield the fastest improvement for read performance - return Collections.min(prunedBuckets, new Comparator<List<SSTableReader>>() - { - public int compare(List<SSTableReader> o1, List<SSTableReader> o2) - { - return Longs.compare(avgSize(o1), avgSize(o2)); - } - - private long avgSize(List<SSTableReader> sstables) - { - long n = 0; - for (SSTableReader sstable : sstables) - n += sstable.bytesOnDisk(); - return n / sstables.size(); - } - }); + return Collections.min(prunedBuckets, avgBucketSizeComparator); } public synchronized AbstractCompactionTask getNextBackgroundTask(int gcBefore)
