From 9dd847135ffdde384b48bdb8a147b27d8bb8b6a4 Mon Sep 17 00:00:00 2001 From: Marcus Olsson Date: Thu, 10 Sep 2015 11:43:26 +0200 Subject: [PATCH] Fix sstable selection when anticompacting Patch by Marcus Olsson; reviewed by marcuse for CASSANDRA-10299 --- .../db/compaction/CompactionManager.java | 28 ++++++++++++------- .../db/compaction/AntiCompactionTest.java | 2 +- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java index 5d88a1174a..e60675afc5 100644 --- a/src/java/org/apache/cassandra/db/compaction/CompactionManager.java +++ b/src/java/org/apache/cassandra/db/compaction/CompactionManager.java @@ -440,12 +440,18 @@ public class CompactionManager implements CompactionManagerMBean Iterator sstableIterator = sstables.iterator(); try { + List> normalizedRanges = Range.normalize(ranges); + while (sstableIterator.hasNext()) { SSTableReader sstable = sstableIterator.next(); - for (Range r : Range.normalize(ranges)) + + Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken(), sstable.partitioner); + + boolean shouldAnticompact = false; + + for (Range r : normalizedRanges) { - Range sstableRange = new Range<>(sstable.first.getToken(), sstable.last.getToken(), sstable.partitioner); if (r.contains(sstableRange)) { logger.info("SSTable {} fully contained in range {}, mutating repairedAt instead of anticompacting", sstable, r); @@ -453,20 +459,22 @@ public class CompactionManager implements CompactionManagerMBean sstable.reloadSSTableMetadata(); mutatedRepairStatuses.add(sstable); sstableIterator.remove(); + shouldAnticompact = true; break; } - else if (!sstableRange.intersects(r)) - { - logger.info("SSTable {} ({}) does not intersect repaired range {}, not touching repairedAt.", sstable, sstableRange, r); - nonAnticompacting.add(sstable); - sstableIterator.remove(); - break; - } - else + else if (sstableRange.intersects(r)) { logger.info("SSTable {} ({}) will be anticompacted on range {}", sstable, sstableRange, r); + shouldAnticompact = true; } } + + if (!shouldAnticompact) + { + logger.info("SSTable {} ({}) does not intersect repaired ranges {}, not touching repairedAt.", sstable, sstableRange, normalizedRanges); + nonAnticompacting.add(sstable); + sstableIterator.remove(); + } } cfs.getDataTracker().notifySSTableRepairedStatusChanged(mutatedRepairStatuses); cfs.getDataTracker().unmarkCompacting(Sets.union(nonAnticompacting, mutatedRepairStatuses)); diff --git a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java index 7756abee1c..56af80160e 100644 --- a/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java +++ b/test/unit/org/apache/cassandra/db/compaction/AntiCompactionTest.java @@ -148,7 +148,7 @@ public class AntiCompactionTest extends SchemaLoader ColumnFamilyStore store = prepareColumnFamilyStore(); Collection sstables = store.getUnrepairedSSTables(); assertEquals(store.getSSTables().size(), sstables.size()); - Range range = new Range(new BytesToken("-10".getBytes()), new BytesToken("-1".getBytes())); + Range range = new Range(new BytesToken("-1".getBytes()), new BytesToken("-10".getBytes())); List> ranges = Arrays.asList(range); Refs refs = Refs.tryRef(sstables);