diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.java hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.java index 227f1e4..54928ea 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactionRequest.java @@ -86,6 +86,10 @@ public class PartitionedMobCompactionRequest extends MobCompactionRequest { public List listFiles() { return Collections.unmodifiableList(files); } + + public int getFileNumbers () { + return files.size(); + } } /** diff --git hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.java hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.java index 33aecc0..dab05d2 100644 --- hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.java +++ hbase-server/src/main/java/org/apache/hadoop/hbase/mob/compactions/PartitionedMobCompactor.java @@ -25,6 +25,7 @@ import java.util.Collection; import java.util.Collections; import java.util.Date; import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -179,6 +180,23 @@ public class PartitionedMobCompactor extends MobCompactor { selectedFileCount++; } } + + /* + * If it is not a major mob compaction with del files, and the file number in Partition is 1, + * remove the partition from filesToCompact list to avoid re-compacting files which has been + * compacted with del files. + */ + if (!allFiles && (allDelFiles.size() > 0)) { + for(Iterator> it = + filesToCompact.entrySet().iterator(); it.hasNext(); ) { + Map.Entry entry = it.next(); + if (entry.getValue().getFileNumbers() <= 1) { + it.remove(); + --selectedFileCount; + } + } + } + PartitionedMobCompactionRequest request = new PartitionedMobCompactionRequest( filesToCompact.values(), allDelFiles); if (candidates.size() == (allDelFiles.size() + selectedFileCount + irrelevantFileCount)) {