Skip to content

Commit c8ccbde

Browse files
committed
HBASE-26434 Do compact when all L0 files are expired (#3830)
Signed-off-by: Duo Zhang <zhangduo@apache.org>
1 parent 3f315d7 commit c8ccbde

File tree

2 files changed

+64
-14
lines changed

2 files changed

+64
-14
lines changed

hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/compactions/StripeCompactionPolicy.java

Lines changed: 22 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,8 @@ public StripeCompactionRequest selectCompaction(StripeInformationProvider si,
129129
List<HStoreFile> l0Files = si.getLevel0Files();
130130

131131
// See if we need to make new stripes.
132-
boolean shouldCompactL0 = this.config.getLevel0MinFiles() <= l0Files.size();
132+
boolean shouldCompactL0 =
133+
this.config.getLevel0MinFiles() <= l0Files.size() || allL0FilesExpired(si);
133134
if (stripeCount == 0) {
134135
if (!shouldCompactL0) {
135136
return null; // nothing to do.
@@ -167,7 +168,7 @@ public boolean needsCompactions(StripeInformationProvider si, List<HStoreFile> f
167168
return filesCompacting.isEmpty()
168169
&& (StoreUtils.hasReferences(si.getStorefiles())
169170
|| (si.getLevel0Files().size() >= this.config.getLevel0MinFiles())
170-
|| needsSingleStripeCompaction(si) || hasExpiredStripes(si));
171+
|| needsSingleStripeCompaction(si) || hasExpiredStripes(si) || allL0FilesExpired(si));
171172
}
172173

173174
@Override
@@ -368,7 +369,25 @@ private StripeCompactionRequest selectExpiredMergeCompaction(
368369
return result;
369370
}
370371

371-
private boolean isStripeExpired(ImmutableList<HStoreFile> storeFiles) {
372+
protected boolean hasExpiredStripes(StripeInformationProvider si) {
373+
// Find if exists a stripe where all files have expired, if any.
374+
ArrayList<ImmutableList<HStoreFile>> stripes = si.getStripes();
375+
for (ImmutableList<HStoreFile> stripe : stripes) {
376+
if (allFilesExpired(stripe)) {
377+
return true;
378+
}
379+
}
380+
return false;
381+
}
382+
383+
protected boolean allL0FilesExpired(StripeInformationProvider si) {
384+
return allFilesExpired(si.getLevel0Files());
385+
}
386+
387+
private boolean allFilesExpired(final List<HStoreFile> storeFiles) {
388+
if (storeFiles == null || storeFiles.isEmpty()) {
389+
return false;
390+
}
372391
long cfTtl = this.storeConfigInfo.getStoreFileTtl();
373392
if (cfTtl == Long.MAX_VALUE) {
374393
return false; // minversion might be set, cannot delete old files
@@ -384,17 +403,6 @@ private boolean isStripeExpired(ImmutableList<HStoreFile> storeFiles) {
384403
return true;
385404
}
386405

387-
protected boolean hasExpiredStripes(StripeInformationProvider si) {
388-
// Find if exists a stripe where all files have expired, if any.
389-
ArrayList<ImmutableList<HStoreFile>> stripes = si.getStripes();
390-
for (ImmutableList<HStoreFile> stripe : stripes) {
391-
if (isStripeExpired(stripe)) {
392-
return true;
393-
}
394-
}
395-
return false;
396-
}
397-
398406
private static long getTotalKvCount(final Collection<HStoreFile> candidates) {
399407
long totalSize = 0;
400408
for (HStoreFile storeFile : candidates) {

hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/compactions/TestStripeCompactionPolicy.java

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.hadoop.hbase.regionserver.compactions;
1919

2020
import static org.apache.hadoop.hbase.regionserver.StripeStoreConfig.MAX_FILES_KEY;
21+
import static org.apache.hadoop.hbase.regionserver.StripeStoreConfig.MIN_FILES_KEY;
2122
import static org.apache.hadoop.hbase.regionserver.StripeStoreFileManager.OPEN_KEY;
2223
import static org.apache.hadoop.hbase.regionserver.compactions.CompactionConfiguration.HBASE_HSTORE_COMPACTION_MAX_SIZE_KEY;
2324
import static org.junit.Assert.assertEquals;
@@ -39,13 +40,15 @@
3940
import static org.mockito.Mockito.times;
4041
import static org.mockito.Mockito.verify;
4142
import static org.mockito.Mockito.when;
43+
4244
import java.io.IOException;
4345
import java.util.ArrayList;
4446
import java.util.Arrays;
4547
import java.util.Collection;
4648
import java.util.Iterator;
4749
import java.util.List;
4850
import java.util.OptionalLong;
51+
4952
import org.apache.hadoop.conf.Configuration;
5053
import org.apache.hadoop.fs.Path;
5154
import org.apache.hadoop.hbase.Cell;
@@ -88,6 +91,7 @@
8891
import org.junit.runners.Parameterized.Parameter;
8992
import org.junit.runners.Parameterized.Parameters;
9093
import org.mockito.ArgumentMatcher;
94+
9195
import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;
9296
import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
9397

@@ -536,6 +540,44 @@ public void testSingleStripeDropDeletes() throws Exception {
536540
true);
537541
}
538542

543+
@Test
544+
public void testCheckExpiredL0Compaction() throws Exception {
545+
Configuration conf = HBaseConfiguration.create();
546+
int minL0 = 100;
547+
conf.setInt(StripeStoreConfig.MIN_FILES_L0_KEY, minL0);
548+
conf.setInt(MIN_FILES_KEY, 4);
549+
550+
ManualEnvironmentEdge edge = new ManualEnvironmentEdge();
551+
long now = defaultTtl + 2;
552+
edge.setValue(now);
553+
EnvironmentEdgeManager.injectEdge(edge);
554+
HStoreFile expiredFile = createFile(10), notExpiredFile = createFile(10);
555+
when(expiredFile.getReader().getMaxTimestamp()).thenReturn(now - defaultTtl - 1);
556+
when(notExpiredFile.getReader().getMaxTimestamp()).thenReturn(now - defaultTtl + 1);
557+
List<HStoreFile> expired = Lists.newArrayList(expiredFile, expiredFile);
558+
List<HStoreFile> mixed = Lists.newArrayList(expiredFile, notExpiredFile);
559+
560+
StripeCompactionPolicy policy =
561+
createPolicy(conf, defaultSplitSize, defaultSplitCount, defaultInitialCount, true);
562+
// Merge expired if there are eligible stripes.
563+
StripeCompactionPolicy.StripeInformationProvider si =
564+
createStripesWithFiles(null, new ArrayList<>(), mixed);
565+
assertFalse(policy.needsCompactions(si, al()));
566+
567+
List<HStoreFile> largeMixed = new ArrayList<>();
568+
for (int i = 0; i < minL0 - 1; i++) {
569+
largeMixed.add(i % 2 == 0 ? notExpiredFile : expiredFile);
570+
}
571+
si = createStripesWithFiles(null, new ArrayList<>(), largeMixed);
572+
assertFalse(policy.needsCompactions(si, al()));
573+
574+
si = createStripesWithFiles(null, new ArrayList<>(), expired);
575+
assertFalse(policy.needsSingleStripeCompaction(si));
576+
assertFalse(policy.hasExpiredStripes(si));
577+
assertTrue(policy.allL0FilesExpired(si));
578+
assertTrue(policy.needsCompactions(si, al()));
579+
}
580+
539581
/********* HELPER METHODS ************/
540582
private static StripeCompactionPolicy createPolicy(
541583
Configuration conf) throws Exception {

0 commit comments

Comments
 (0)