Skip to content

Commit 6ff8b06

Browse files
vinayakphegdewchevreuil
authored andcommitted
HBASE-28505 Implement enforcement to require Date Tiered Compaction for Time Range Data Tiering (#5809)
Signed-off-by: Wellington Chevreuil <wchevreuil@apache.org>
1 parent 76a995d commit 6ff8b06

File tree

3 files changed

+84
-0
lines changed

3 files changed

+84
-0
lines changed

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,9 @@
4141
@InterfaceAudience.Private
4242
public class DateTieredStoreEngine extends StoreEngine<DefaultStoreFlusher,
4343
DateTieredCompactionPolicy, DateTieredCompactor, DefaultStoreFileManager> {
44+
45+
public static final String DATE_TIERED_STORE_ENGINE = DateTieredStoreEngine.class.getName();
46+
4447
@Override
4548
public boolean needsCompaction(List<HStoreFile> filesCompacting) {
4649
return compactionPolicy.needsCompaction(storeFileManager.getStoreFiles(), filesCompacting);

hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@
1717
*/
1818
package org.apache.hadoop.hbase.util;
1919

20+
import static org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine.DATE_TIERED_STORE_ENGINE;
21+
2022
import java.io.IOException;
2123
import org.apache.hadoop.conf.Configuration;
2224
import org.apache.hadoop.hbase.CompoundConfiguration;
@@ -28,10 +30,13 @@
2830
import org.apache.hadoop.hbase.client.TableDescriptor;
2931
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
3032
import org.apache.hadoop.hbase.fs.ErasureCodingUtils;
33+
import org.apache.hadoop.hbase.regionserver.DataTieringManager;
34+
import org.apache.hadoop.hbase.regionserver.DataTieringType;
3135
import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;
3236
import org.apache.hadoop.hbase.regionserver.HStore;
3337
import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;
3438
import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;
39+
import org.apache.hadoop.hbase.regionserver.StoreEngine;
3540
import org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;
3641
import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;
3742
import org.apache.yetus.audience.InterfaceAudience;
@@ -191,6 +196,8 @@ public static void sanityCheck(final Configuration c, final TableDescriptor td)
191196

192197
// check in-memory compaction
193198
warnOrThrowExceptionForFailure(logWarn, hcd::getInMemoryCompaction);
199+
200+
checkDateTieredCompactionForTimeRangeDataTiering(conf, td);
194201
}
195202
}
196203

@@ -210,6 +217,35 @@ private static void checkReplicationScope(final Configuration conf, final TableD
210217
});
211218
}
212219

220+
private static void checkDateTieredCompactionForTimeRangeDataTiering(final Configuration conf,
221+
final TableDescriptor td) throws IOException {
222+
// Table level configurations
223+
checkDateTieredCompactionForTimeRangeDataTiering(conf);
224+
for (ColumnFamilyDescriptor cfd : td.getColumnFamilies()) {
225+
// Column family level configurations
226+
Configuration cfdConf =
227+
new CompoundConfiguration().add(conf).addStringMap(cfd.getConfiguration());
228+
checkDateTieredCompactionForTimeRangeDataTiering(cfdConf);
229+
}
230+
}
231+
232+
private static void checkDateTieredCompactionForTimeRangeDataTiering(final Configuration conf)
233+
throws IOException {
234+
final String errorMessage =
235+
"Time Range Data Tiering should be enabled with Date Tiered Compaction.";
236+
237+
warnOrThrowExceptionForFailure(false, () -> {
238+
239+
// Determine whether Date Tiered Compaction will be enabled when Time Range Data Tiering is
240+
// enabled after the configuration change.
241+
if (DataTieringType.TIME_RANGE.name().equals(conf.get(DataTieringManager.DATATIERING_KEY))) {
242+
if (!DATE_TIERED_STORE_ENGINE.equals(conf.get(StoreEngine.STORE_ENGINE_CLASS_KEY))) {
243+
throw new IllegalArgumentException(errorMessage);
244+
}
245+
}
246+
});
247+
}
248+
213249
private static void checkCompactionPolicy(final Configuration conf, final TableDescriptor td)
214250
throws IOException {
215251
warnOrThrowExceptionForFailure(false, () -> {

hbase-server/src/test/java/org/apache/hadoop/hbase/client/TestIllegalTableDescriptor.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,9 @@
3131
import org.apache.hadoop.hbase.HBaseTestingUtil;
3232
import org.apache.hadoop.hbase.HConstants;
3333
import org.apache.hadoop.hbase.TableName;
34+
import org.apache.hadoop.hbase.regionserver.DataTieringManager;
35+
import org.apache.hadoop.hbase.regionserver.DataTieringType;
36+
import org.apache.hadoop.hbase.regionserver.StoreEngine;
3437
import org.apache.hadoop.hbase.testclassification.ClientTests;
3538
import org.apache.hadoop.hbase.testclassification.LargeTests;
3639
import org.apache.hadoop.hbase.util.Bytes;
@@ -187,6 +190,48 @@ public void testIllegalTableDescriptor() throws Exception {
187190
+ "cause very frequent flushing."));
188191
}
189192

193+
@Test
194+
public void testIllegalTableDescriptorWithDataTiering() throws IOException {
195+
// table level configuration changes
196+
TableDescriptorBuilder builder =
197+
TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()));
198+
ColumnFamilyDescriptorBuilder cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(FAMILY);
199+
builder.setColumnFamily(cfBuilder.build());
200+
201+
// First scenario: DataTieringType set to TIME_RANGE without DateTieredStoreEngine
202+
builder.setValue(DataTieringManager.DATATIERING_KEY, DataTieringType.TIME_RANGE.name());
203+
checkTableIsIllegal(builder.build());
204+
205+
// Second scenario: DataTieringType set to TIME_RANGE with DateTieredStoreEngine
206+
builder.setValue(StoreEngine.STORE_ENGINE_CLASS_KEY,
207+
"org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine");
208+
checkTableIsLegal(builder.build());
209+
210+
// Third scenario: Disabling DateTieredStoreEngine while Time Range DataTiering is active
211+
builder.setValue(StoreEngine.STORE_ENGINE_CLASS_KEY,
212+
"org.apache.hadoop.hbase.regionserver.DefaultStoreEngine");
213+
checkTableIsIllegal(builder.build());
214+
215+
// column family level configuration changes
216+
builder = TableDescriptorBuilder.newBuilder(TableName.valueOf(name.getMethodName()));
217+
cfBuilder = ColumnFamilyDescriptorBuilder.newBuilder(FAMILY);
218+
219+
// First scenario: DataTieringType set to TIME_RANGE without DateTieredStoreEngine
220+
cfBuilder.setConfiguration(DataTieringManager.DATATIERING_KEY,
221+
DataTieringType.TIME_RANGE.name());
222+
checkTableIsIllegal(builder.setColumnFamily(cfBuilder.build()).build());
223+
224+
// Second scenario: DataTieringType set to TIME_RANGE with DateTieredStoreEngine
225+
cfBuilder.setConfiguration(StoreEngine.STORE_ENGINE_CLASS_KEY,
226+
"org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine");
227+
checkTableIsLegal(builder.modifyColumnFamily(cfBuilder.build()).build());
228+
229+
// Third scenario: Disabling DateTieredStoreEngine while Time Range DataTiering is active
230+
cfBuilder.setConfiguration(StoreEngine.STORE_ENGINE_CLASS_KEY,
231+
"org.apache.hadoop.hbase.regionserver.DefaultStoreEngine");
232+
checkTableIsIllegal(builder.modifyColumnFamily(cfBuilder.build()).build());
233+
}
234+
190235
private void checkTableIsLegal(TableDescriptor tableDescriptor) throws IOException {
191236
Admin admin = TEST_UTIL.getAdmin();
192237
admin.createTable(tableDescriptor);

0 commit comments

Comments
 (0)