diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFileManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFileManager.java index f5c3fa7..b6ffe99 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFileManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultStoreFileManager.java @@ -30,6 +30,7 @@ import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.io.TimeRange; import org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration; import org.apache.yetus.audience.InterfaceAudience; import org.slf4j.Logger; @@ -179,10 +180,15 @@ class DefaultStoreFileManager implements StoreFileManager { // 2) Files that are not the latest can't become one due to (1), so the rest are fair game. return files.stream().limit(Math.max(0, files.size() - 1)).filter(sf -> { long fileTs = sf.getReader().getMaxTimestamp(); + long entryCount = sf.getReader().getEntries(); if (fileTs < maxTs && !filesCompacting.contains(sf)) { LOG.info("Found an expired store file {} whose maxTimestamp is {}, which is below {}", sf.getPath(), fileTs, maxTs); return true; + } else if(entryCount == 0 && fileTs == TimeRange.INITIAL_MAX_TIMESTAMP + && !filesCompacting.contains(sf)) { + LOG.info("Found an empty store file {} whose maxTimestamp is {},", sf.getPath(), fileTs); + return true; } else { return false; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java index 8caf013..2323b17 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/StripeStoreFileManager.java @@ -37,6 +37,7 @@ import org.apache.hadoop.hbase.CellComparator; import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.KeyValue; +import org.apache.hadoop.hbase.io.TimeRange; import org.apache.hadoop.hbase.regionserver.compactions.StripeCompactionPolicy; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.ConcatenatedLists; @@ -1033,6 +1034,7 @@ public class StripeStoreFileManager HStoreFile sf = stripe.get(i); synchronized (sf) { long fileTs = sf.getReader().getMaxTimestamp(); + long entryCount = sf.getReader().getEntries(); if (fileTs < maxTs && !filesCompacting.contains(sf)) { LOG.info("Found an expired store file: " + sf.getPath() + " whose maxTimestamp is " + fileTs + ", which is below " + maxTs); @@ -1040,6 +1042,13 @@ public class StripeStoreFileManager expiredStoreFiles = new ArrayList<>(); } expiredStoreFiles.add(sf); + } else if(entryCount == 0 && fileTs == TimeRange.INITIAL_MAX_TIMESTAMP + && !filesCompacting.contains(sf)) { + LOG.info("Found an empty store file {} whose maxTimestamp is {},", sf.getPath(), fileTs); + if (expiredStoreFiles == null) { + expiredStoreFiles = new ArrayList<>(); + } + expiredStoreFiles.add(sf); } } }