Skip to content

Commit a4722d0

Browse files
committed
HBASE-26434 Do compact when all L0 files are expired
1 parent 1af2262 commit a4722d0

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;
@@ -38,13 +39,15 @@
3839
import static org.mockito.Mockito.times;
3940
import static org.mockito.Mockito.verify;
4041
import static org.mockito.Mockito.when;
42+
4143
import java.io.IOException;
4244
import java.util.ArrayList;
4345
import java.util.Arrays;
4446
import java.util.Collection;
4547
import java.util.Iterator;
4648
import java.util.List;
4749
import java.util.OptionalLong;
50+
4851
import org.apache.hadoop.conf.Configuration;
4952
import org.apache.hadoop.fs.Path;
5053
import org.apache.hadoop.hbase.Cell;
@@ -91,6 +94,7 @@
9194
import org.junit.runners.Parameterized.Parameter;
9295
import org.junit.runners.Parameterized.Parameters;
9396
import org.mockito.ArgumentMatcher;
97+
9498
import org.apache.hbase.thirdparty.com.google.common.collect.ImmutableList;
9599
import org.apache.hbase.thirdparty.com.google.common.collect.Lists;
96100

@@ -539,6 +543,44 @@ public void testSingleStripeDropDeletes() throws Exception {
539543
true);
540544
}
541545

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

0 commit comments

Comments
 (0)