(hbase) 02/05: HBASE-28505 Implement enforcement to require Date Tiered Compaction for Time Range Data Tiering (#5809)

2024-05-21 Thread wchevreuil
This is an automated email from the ASF dual-hosted git repository.

wchevreuil pushed a commit to branch HBASE-28463
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 6ff8b067ae23d2f0775aa7bde79b9bdc0b1f6e9c
Author: vinayak hegde 
AuthorDate: Fri Apr 12 14:54:37 2024 +0530

HBASE-28505 Implement enforcement to require Date Tiered Compaction for 
Time Range Data Tiering (#5809)


Signed-off-by: Wellington Chevreuil 
---
 .../hbase/regionserver/DateTieredStoreEngine.java  |  3 ++
 .../hadoop/hbase/util/TableDescriptorChecker.java  | 36 +
 .../hbase/client/TestIllegalTableDescriptor.java   | 45 ++
 3 files changed, 84 insertions(+)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
index ded6564bce5..26437ab1124 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
@@ -41,6 +41,9 @@ import org.apache.yetus.audience.InterfaceAudience;
 @InterfaceAudience.Private
 public class DateTieredStoreEngine extends StoreEngine {
+
+  public static final String DATE_TIERED_STORE_ENGINE = 
DateTieredStoreEngine.class.getName();
+
   @Override
   public boolean needsCompaction(List filesCompacting) {
 return compactionPolicy.needsCompaction(storeFileManager.getStoreFiles(), 
filesCompacting);
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
index 94e2e4bbfa0..471583b32b7 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.hbase.util;
 
+import static 
org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine.DATE_TIERED_STORE_ENGINE;
+
 import java.io.IOException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.CompoundConfiguration;
@@ -28,10 +30,13 @@ import 
org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.fs.ErasureCodingUtils;
+import org.apache.hadoop.hbase.regionserver.DataTieringManager;
+import org.apache.hadoop.hbase.regionserver.DataTieringType;
 import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;
 import org.apache.hadoop.hbase.regionserver.HStore;
 import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;
 import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;
+import org.apache.hadoop.hbase.regionserver.StoreEngine;
 import 
org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;
 import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;
 import org.apache.yetus.audience.InterfaceAudience;
@@ -191,6 +196,8 @@ public final class TableDescriptorChecker {
 
   // check in-memory compaction
   warnOrThrowExceptionForFailure(logWarn, hcd::getInMemoryCompaction);
+
+  checkDateTieredCompactionForTimeRangeDataTiering(conf, td);
 }
   }
 
@@ -210,6 +217,35 @@ public final class TableDescriptorChecker {
 });
   }
 
+  private static void checkDateTieredCompactionForTimeRangeDataTiering(final 
Configuration conf,
+final TableDescriptor td) throws IOException {
+// Table level configurations
+checkDateTieredCompactionForTimeRangeDataTiering(conf);
+for (ColumnFamilyDescriptor cfd : td.getColumnFamilies()) {
+  // Column family level configurations
+  Configuration cfdConf =
+new 
CompoundConfiguration().add(conf).addStringMap(cfd.getConfiguration());
+  checkDateTieredCompactionForTimeRangeDataTiering(cfdConf);
+}
+  }
+
+  private static void checkDateTieredCompactionForTimeRangeDataTiering(final 
Configuration conf)
+throws IOException {
+final String errorMessage =
+  "Time Range Data Tiering should be enabled with Date Tiered Compaction.";
+
+warnOrThrowExceptionForFailure(false, () -> {
+
+  // Determine whether Date Tiered Compaction will be enabled when Time 
Range Data Tiering is
+  // enabled after the configuration change.
+  if 
(DataTieringType.TIME_RANGE.name().equals(conf.get(DataTieringManager.DATATIERING_KEY)))
 {
+if 
(!DATE_TIERED_STORE_ENGINE.equals(conf.get(StoreEngine.STORE_ENGINE_CLASS_KEY)))
 {
+  throw new IllegalArgumentException(errorMessage);
+}
+  }
+});
+  }
+
   private static void checkCompactionPolicy(final Configuration conf, final 
TableDescriptor td)
 throws IOException {
 warnOrThrowExceptionForFailure(false, () -> 

(hbase) 02/05: HBASE-28505 Implement enforcement to require Date Tiered Compaction for Time Range Data Tiering (#5809)

2024-05-20 Thread wchevreuil
This is an automated email from the ASF dual-hosted git repository.

wchevreuil pushed a commit to branch HBASE-28463
in repository https://gitbox.apache.org/repos/asf/hbase.git

commit 99c412fe156158004f4fd09eb8c122cf7765b9ac
Author: vinayak hegde 
AuthorDate: Fri Apr 12 14:54:37 2024 +0530

HBASE-28505 Implement enforcement to require Date Tiered Compaction for 
Time Range Data Tiering (#5809)


Signed-off-by: Wellington Chevreuil 
---
 .../hbase/regionserver/DateTieredStoreEngine.java  |  3 ++
 .../hadoop/hbase/util/TableDescriptorChecker.java  | 36 +
 .../hbase/client/TestIllegalTableDescriptor.java   | 45 ++
 3 files changed, 84 insertions(+)

diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
index ded6564bce5..26437ab1124 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DateTieredStoreEngine.java
@@ -41,6 +41,9 @@ import org.apache.yetus.audience.InterfaceAudience;
 @InterfaceAudience.Private
 public class DateTieredStoreEngine extends StoreEngine {
+
+  public static final String DATE_TIERED_STORE_ENGINE = 
DateTieredStoreEngine.class.getName();
+
   @Override
   public boolean needsCompaction(List filesCompacting) {
 return compactionPolicy.needsCompaction(storeFileManager.getStoreFiles(), 
filesCompacting);
diff --git 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
index 94e2e4bbfa0..471583b32b7 100644
--- 
a/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
+++ 
b/hbase-server/src/main/java/org/apache/hadoop/hbase/util/TableDescriptorChecker.java
@@ -17,6 +17,8 @@
  */
 package org.apache.hadoop.hbase.util;
 
+import static 
org.apache.hadoop.hbase.regionserver.DateTieredStoreEngine.DATE_TIERED_STORE_ENGINE;
+
 import java.io.IOException;
 import org.apache.hadoop.conf.Configuration;
 import org.apache.hadoop.hbase.CompoundConfiguration;
@@ -28,10 +30,13 @@ import 
org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
 import org.apache.hadoop.hbase.client.TableDescriptor;
 import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
 import org.apache.hadoop.hbase.fs.ErasureCodingUtils;
+import org.apache.hadoop.hbase.regionserver.DataTieringManager;
+import org.apache.hadoop.hbase.regionserver.DataTieringType;
 import org.apache.hadoop.hbase.regionserver.DefaultStoreEngine;
 import org.apache.hadoop.hbase.regionserver.HStore;
 import org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost;
 import org.apache.hadoop.hbase.regionserver.RegionSplitPolicy;
+import org.apache.hadoop.hbase.regionserver.StoreEngine;
 import 
org.apache.hadoop.hbase.regionserver.compactions.ExploringCompactionPolicy;
 import org.apache.hadoop.hbase.regionserver.compactions.FIFOCompactionPolicy;
 import org.apache.yetus.audience.InterfaceAudience;
@@ -191,6 +196,8 @@ public final class TableDescriptorChecker {
 
   // check in-memory compaction
   warnOrThrowExceptionForFailure(logWarn, hcd::getInMemoryCompaction);
+
+  checkDateTieredCompactionForTimeRangeDataTiering(conf, td);
 }
   }
 
@@ -210,6 +217,35 @@ public final class TableDescriptorChecker {
 });
   }
 
+  private static void checkDateTieredCompactionForTimeRangeDataTiering(final 
Configuration conf,
+final TableDescriptor td) throws IOException {
+// Table level configurations
+checkDateTieredCompactionForTimeRangeDataTiering(conf);
+for (ColumnFamilyDescriptor cfd : td.getColumnFamilies()) {
+  // Column family level configurations
+  Configuration cfdConf =
+new 
CompoundConfiguration().add(conf).addStringMap(cfd.getConfiguration());
+  checkDateTieredCompactionForTimeRangeDataTiering(cfdConf);
+}
+  }
+
+  private static void checkDateTieredCompactionForTimeRangeDataTiering(final 
Configuration conf)
+throws IOException {
+final String errorMessage =
+  "Time Range Data Tiering should be enabled with Date Tiered Compaction.";
+
+warnOrThrowExceptionForFailure(false, () -> {
+
+  // Determine whether Date Tiered Compaction will be enabled when Time 
Range Data Tiering is
+  // enabled after the configuration change.
+  if 
(DataTieringType.TIME_RANGE.name().equals(conf.get(DataTieringManager.DATATIERING_KEY)))
 {
+if 
(!DATE_TIERED_STORE_ENGINE.equals(conf.get(StoreEngine.STORE_ENGINE_CLASS_KEY)))
 {
+  throw new IllegalArgumentException(errorMessage);
+}
+  }
+});
+  }
+
   private static void checkCompactionPolicy(final Configuration conf, final 
TableDescriptor td)
 throws IOException {
 warnOrThrowExceptionForFailure(false, () ->