This is an automated email from the ASF dual-hosted git repository.

sarvekshayr pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/ozone.git


The following commit(s) were added to refs/heads/master by this push:
     new a3ca93ac435 HDDS-15342. Make RocksDB bottommost level compaction 
options configurable for background compaction (#10419)
a3ca93ac435 is described below

commit a3ca93ac43554433b88ed2cf32fc313c3def1772
Author: Rishabh Patel <[email protected]>
AuthorDate: Sun Jul 19 22:44:33 2026 -0700

    HDDS-15342. Make RocksDB bottommost level compaction options configurable 
for background compaction (#10419)
---
 .../common/src/main/resources/ozone-default.xml    | 10 +++
 .../ozone/repair/ldb/RocksDBManualCompaction.java  | 15 ++--
 .../apache/hadoop/ozone/repair/om/CompactOMDB.java | 14 ++--
 .../hadoop/ozone/repair/ldb/TestLdbRepair.java     |  2 +-
 hadoop-ozone/common/pom.xml                        |  4 +
 .../org/apache/hadoop/ozone/om/OMConfigKeys.java   | 12 +++
 .../compose/ozonesecure-ha/test-repair-tools.sh    |  2 +-
 .../hadoop/ozone/om/service/CompactDBUtil.java     | 19 +++++
 .../hadoop/ozone/om/service/CompactionService.java | 12 ++-
 .../hadoop/ozone/om/service/TestCompactDBUtil.java | 92 ++++++++++++++++++++++
 .../ozone/om/service/TestCompactionService.java    | 33 ++++++++
 pom.xml                                            |  1 +
 12 files changed, 193 insertions(+), 23 deletions(-)

diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml 
b/hadoop-hdds/common/src/main/resources/ozone-default.xml
index 6a6a78e58fb..ee5c752e65f 100644
--- a/hadoop-hdds/common/src/main/resources/ozone-default.xml
+++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml
@@ -1600,6 +1600,16 @@
       If this is empty, no column families are compacted.
     </description>
   </property>
+  <property>
+    <name>ozone.om.compaction.service.bottommost-level-compaction</name>
+    <value>kSkip</value>
+    <tag>OZONE, OM, PERFORMANCE</tag>
+    <description>
+      Bottommost level compaction type for compaction.
+      Invalid values will default to kSkip.
+      Valid values: kSkip, kIfHaveCompactionFilter, kForce, kForceOptimized.
+    </description>
+  </property>
 
   <property>
     <name>ozone.om.snapshot.compact.non.snapshot.diff.tables</name>
diff --git 
a/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/ldb/RocksDBManualCompaction.java
 
b/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/ldb/RocksDBManualCompaction.java
index 0b89bb42418..1a2373b08fa 100644
--- 
a/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/ldb/RocksDBManualCompaction.java
+++ 
b/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/ldb/RocksDBManualCompaction.java
@@ -27,7 +27,6 @@
 import org.apache.hadoop.hdds.utils.db.managed.ManagedDBOptions;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
 import org.apache.hadoop.ozone.debug.RocksDBUtils;
-import org.apache.hadoop.ozone.om.service.CompactDBUtil;
 import org.apache.hadoop.ozone.repair.RepairTool;
 import org.apache.hadoop.util.Time;
 import org.rocksdb.ColumnFamilyDescriptor;
@@ -64,11 +63,11 @@ public class RocksDBManualCompaction extends RepairTool {
   private String columnFamilyName;
 
   @CommandLine.Option(names = {"--bottommost-level-compaction", "--blc"},
-      description = "BottommostLevelCompaction option for RocksDB compaction." 
+
-          " Valid values: 0 (kSkip), 1 (kIfHaveCompactionFilter), 2 (kForce), 
3 (kForceOptimized).",
-      defaultValue = "0",
+      description = "BottommostLevelCompaction algorithm for RocksDB 
compaction." +
+          "  Valid values: ${COMPLETION-CANDIDATES}",
+      defaultValue = "kSkip",
       showDefaultValue = CommandLine.Help.Visibility.ALWAYS)
-  private int bottommostLevelCompaction;
+  private ManagedCompactRangeOptions.BottommostLevelCompaction 
bottommostLevelCompaction;
 
   private String getConsoleReadLineWithFormat() {
     err().printf(WARNING_TO_STOP_SERVICE);
@@ -104,14 +103,12 @@ public void execute() throws Exception {
             " is not in a column family in DB for the given path.");
       }
 
-      ManagedCompactRangeOptions.BottommostLevelCompaction blcOption =
-          
CompactDBUtil.getBottommostLevelCompaction(bottommostLevelCompaction);
       info("Running compaction on " + columnFamilyName +
-          " with bottommost level compaction: " + blcOption.name());
+          " with bottommost level compaction: " + 
bottommostLevelCompaction.name());
       long startTime = Time.monotonicNow();
       if (!isDryRun()) {
         ManagedCompactRangeOptions compactOptions = new 
ManagedCompactRangeOptions();
-        compactOptions.setBottommostLevelCompaction(blcOption);
+        compactOptions.setBottommostLevelCompaction(bottommostLevelCompaction);
         db.get().compactRange(cfh, null, null, compactOptions);
       }
       long duration = Time.monotonicNow() - startTime;
diff --git 
a/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/om/CompactOMDB.java
 
b/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/om/CompactOMDB.java
index bef7c0419dc..a405944e91a 100644
--- 
a/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/om/CompactOMDB.java
+++ 
b/hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/om/CompactOMDB.java
@@ -24,7 +24,6 @@
 import org.apache.hadoop.ozone.OmUtils;
 import org.apache.hadoop.ozone.om.helpers.OMNodeDetails;
 import org.apache.hadoop.ozone.om.protocolPB.OMAdminProtocolClientSideImpl;
-import org.apache.hadoop.ozone.om.service.CompactDBUtil;
 import org.apache.hadoop.ozone.repair.RepairTool;
 import org.apache.hadoop.security.UserGroupInformation;
 import picocli.CommandLine;
@@ -64,10 +63,10 @@ public class CompactOMDB extends RepairTool {
 
   @CommandLine.Option(names = {"--bottommost-level-compaction", "--blc"},
       description = "BottommostLevelCompaction option for RocksDB compaction." 
+
-          " Valid values: 0 (kSkip), 1 (kIfHaveCompactionFilter), 2 (kForce), 
3 (kForceOptimized).",
-      defaultValue = "0",
+          "  Valid values: ${COMPLETION-CANDIDATES}",
+      defaultValue = "kSkip",
       showDefaultValue = CommandLine.Help.Visibility.ALWAYS)
-  private int bottommostLevelCompaction;
+  private ManagedCompactRangeOptions.BottommostLevelCompaction 
bottommostLevelCompaction;
 
   @Override
   public void execute() throws Exception {
@@ -90,15 +89,14 @@ public void execute() throws Exception {
     }
 
     String omDisplay = nodeId != null ? nodeId : 
omNodeDetails.getRpcAddressString();
-    ManagedCompactRangeOptions.BottommostLevelCompaction blcOption =
-        CompactDBUtil.getBottommostLevelCompaction(bottommostLevelCompaction);
     if (!isDryRun()) {
       try (OMAdminProtocolClientSideImpl omAdminProtocolClient =
                OMAdminProtocolClientSideImpl.createProxyForSingleOM(conf,
                    UserGroupInformation.getCurrentUser(), omNodeDetails)) {
-        omAdminProtocolClient.compactOMDB(columnFamilyName, 
blcOption.getValue());
+        omAdminProtocolClient.compactOMDB(columnFamilyName, 
bottommostLevelCompaction.getValue());
         info("Compaction request issued for om.db of om node: %s, 
column-family: %s" +
-            " with bottommost level compaction: %s.", omDisplay, 
columnFamilyName, blcOption.name());
+            " with bottommost level compaction: %s.",
+            omDisplay, columnFamilyName, bottommostLevelCompaction.name());
         info("Please check role logs of %s for completion status.", omDisplay);
       } catch (IOException ex) {
         error("Couldn't compact column %s. \nException: %s", columnFamilyName, 
ex);
diff --git 
a/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/ldb/TestLdbRepair.java
 
b/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/ldb/TestLdbRepair.java
index af5001ed174..29602b2679c 100644
--- 
a/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/ldb/TestLdbRepair.java
+++ 
b/hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/ldb/TestLdbRepair.java
@@ -126,7 +126,7 @@ public void testRocksDBManualCompaction() throws Exception {
     String[] args = {
         "--db", dbPath.toString(),
         "--column-family", TEST_CF_NAME,
-        "--blc", "2"
+        "--blc", "kForce"
     };
     // Pass two "y" inputs - one for user confirmation and the other for 
warning to stop service
     int exitCode = withTextFromSystemIn("y", "y")
diff --git a/hadoop-ozone/common/pom.xml b/hadoop-ozone/common/pom.xml
index a5318a66f83..c5fc6aeb27b 100644
--- a/hadoop-ozone/common/pom.xml
+++ b/hadoop-ozone/common/pom.xml
@@ -121,6 +121,10 @@
       <groupId>org.apache.ratis</groupId>
       <artifactId>ratis-thirdparty-misc</artifactId>
     </dependency>
+    <dependency>
+      <groupId>org.rocksdb</groupId>
+      <artifactId>rocksdbjni</artifactId>
+    </dependency>
     <dependency>
       <groupId>org.slf4j</groupId>
       <artifactId>slf4j-api</artifactId>
diff --git 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
index 02b270070ed..66cea2763fd 100644
--- 
a/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
+++ 
b/hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/OMConfigKeys.java
@@ -22,6 +22,7 @@
 import org.apache.hadoop.hdds.client.ReplicationType;
 import org.apache.hadoop.ozone.om.helpers.BucketLayout;
 import org.apache.ratis.util.TimeDuration;
+import org.rocksdb.CompactRangeOptions.BottommostLevelCompaction;
 
 /**
  * Ozone Manager Constants.
@@ -693,6 +694,17 @@ public final class OMConfigKeys {
   public static final String 
OZONE_OM_COMPACTION_SERVICE_COLUMNFAMILIES_DEFAULT =
       
"keyTable,fileTable,directoryTable,deletedTable,deletedDirectoryTable,multipartInfoTable,multipartPartsTable";
 
+  /**
+   * Bottommost level compaction type for manual compaction.
+   * Invalid values will default to kSkip.
+   * Valid values: kSkip, kIfHaveCompactionFilter, kForce, kForceOptimized.
+   * Refer to {@code 
org.rocksdb.CompactRangeOptions.BottommostLevelCompaction}.
+   */
+  public static final String 
OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION =
+      "ozone.om.compaction.service.bottommost-level-compaction";
+  public static final BottommostLevelCompaction
+      OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION_DEFAULT = 
BottommostLevelCompaction.kSkip;
+
   /**
    * Configuration to enable/disable non-snapshot diff table compaction when 
snapshots are evicted from cache.
    */
diff --git 
a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-repair-tools.sh 
b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-repair-tools.sh
index 1e8f2d78eb2..ee00dd95840 100644
--- a/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-repair-tools.sh
+++ b/hadoop-ozone/dist/src/main/compose/ozonesecure-ha/test-repair-tools.sh
@@ -112,7 +112,7 @@ check_om_log() {
 
 compact_om_db() {
   for cf in "$@"; do
-    execute_command_in_container ${OM} ozone repair om compact --cf="${cf}" 
--service-id "${OM_SERVICE_ID}" --node-id "${OM}" --blc 2
+    execute_command_in_container ${OM} ozone repair om compact --cf="${cf}" 
--service-id "${OM_SERVICE_ID}" --node-id "${OM}" --blc kForce
     retry check_om_log "$cf"
   done
 }
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBUtil.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBUtil.java
index 73c54f2586d..d21a655cf9b 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBUtil.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBUtil.java
@@ -20,9 +20,11 @@
 import java.io.IOException;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.CompletionException;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
 import org.apache.hadoop.hdds.utils.db.RDBStore;
 import org.apache.hadoop.hdds.utils.db.RocksDatabase;
 import org.apache.hadoop.hdds.utils.db.managed.ManagedCompactRangeOptions;
+import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.util.Time;
 import org.slf4j.Logger;
@@ -74,6 +76,23 @@ public static CompletableFuture<Void> 
compactTableAsync(OMMetadataManager metada
     });
   }
 
+  public static ManagedCompactRangeOptions.BottommostLevelCompaction 
getBottommostLevelCompaction(
+      OzoneConfiguration configuration) {
+    ManagedCompactRangeOptions.BottommostLevelCompaction blc =
+        
OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION_DEFAULT;
+
+    try {
+      blc = configuration.getEnum(
+          OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION,
+          
OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION_DEFAULT);
+    } catch (IllegalArgumentException e) {
+      LOG.warn("Invalid value for bottommost level compaction configuration 
'{}'",
+          
configuration.get(OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION),
 e);
+    }
+
+    return blc;
+  }
+
   /**
    * Converts the given RocksDB id to a
    * {@link ManagedCompactRangeOptions.BottommostLevelCompaction} enum value.
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactionService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactionService.java
index 34c7a8ff867..053efcbace6 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactionService.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactionService.java
@@ -54,6 +54,7 @@ public class CompactionService extends BackgroundService {
   private final AtomicBoolean suspended;
   // list of tables that can be compacted
   private final List<String> compactableTables;
+  private final ManagedCompactRangeOptions.BottommostLevelCompaction 
bottommostLevelCompaction;
 
   public CompactionService(OzoneManager ozoneManager, TimeUnit unit, long 
interval, long timeout,
                            List<String> tables) {
@@ -66,6 +67,7 @@ public CompactionService(OzoneManager ozoneManager, TimeUnit 
unit, long interval
     this.numCompactions = new AtomicLong(0);
     this.suspended = new AtomicBoolean(false);
     this.compactableTables = validateTables(tables);
+    this.bottommostLevelCompaction = 
CompactDBUtil.getBottommostLevelCompaction(ozoneManager.getConfiguration());
   }
 
   private List<String> validateTables(List<String> tables) {
@@ -109,6 +111,10 @@ public List<String> getCompactableTables() {
     return compactableTables;
   }
 
+  ManagedCompactRangeOptions.BottommostLevelCompaction 
getBottommostLevelCompaction() {
+    return bottommostLevelCompaction;
+  }
+
   /**
    * Returns the number of manual compactions performed.
    *
@@ -142,13 +148,11 @@ private boolean shouldRun() {
    * @return CompletableFuture that completes when compaction finishes
    */
   public CompletableFuture<Void> compactTableAsync(String tableName) {
-    return CompactDBUtil.compactTableAsync(omMetadataManager, tableName,
-        ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
+    return CompactDBUtil.compactTableAsync(omMetadataManager, tableName, 
bottommostLevelCompaction);
   }
 
   protected void compactFully(String tableName) throws IOException {
-    CompactDBUtil.compactTable(omMetadataManager, tableName,
-        ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
+    CompactDBUtil.compactTable(omMetadataManager, tableName, 
bottommostLevelCompaction);
   }
 
   private class CompactTask implements BackgroundTask {
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactDBUtil.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactDBUtil.java
new file mode 100644
index 00000000000..f757549c8eb
--- /dev/null
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactDBUtil.java
@@ -0,0 +1,92 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.hadoop.ozone.om.service;
+
+import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION;
+import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION_DEFAULT;
+import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_DB_DIRS;
+import static 
org.apache.hadoop.ozone.om.service.CompactDBUtil.getBottommostLevelCompaction;
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+import java.io.File;
+import java.io.IOException;
+import org.apache.hadoop.hdds.conf.OzoneConfiguration;
+import org.apache.hadoop.hdds.utils.db.managed.ManagedCompactRangeOptions;
+import org.apache.hadoop.ozone.om.OMMetadataManager;
+import org.apache.hadoop.ozone.om.OmMetadataManagerImpl;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.io.TempDir;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.EnumSource;
+import org.junit.jupiter.params.provider.ValueSource;
+
+/**
+ * Tests for {@link CompactDBUtil}.
+ */
+class TestCompactDBUtil {
+
+  private OMMetadataManager omMetadataManager;
+
+  @BeforeEach
+  void setup(@TempDir File tempDir) throws Exception {
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(OZONE_OM_DB_DIRS, tempDir.getAbsolutePath());
+    omMetadataManager = new OmMetadataManagerImpl(conf, null);
+  }
+
+  @ParameterizedTest
+  @EnumSource(ManagedCompactRangeOptions.BottommostLevelCompaction.class)
+  void 
testCompactionAlgorithms(ManagedCompactRangeOptions.BottommostLevelCompaction 
bottommostLevelCompaction) {
+    assertDoesNotThrow(() ->
+        CompactDBUtil.compactTable(omMetadataManager, "keyTable", 
bottommostLevelCompaction));
+  }
+
+  @Test
+  void testCompactInvalidColumnFamily() {
+    assertThrows(IOException.class, () ->
+        CompactDBUtil.compactTable(omMetadataManager, "nonExistentTable",
+            ManagedCompactRangeOptions.BottommostLevelCompaction.kSkip));
+  }
+
+  @Test
+  void testDefaultConfigValueMapsToKSkip() {
+    assertEquals(ManagedCompactRangeOptions.BottommostLevelCompaction.kSkip,
+        OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION_DEFAULT);
+  }
+
+  @ParameterizedTest
+  @ValueSource(strings = {"", "kForceeee"})
+  void testDefaultConfigKeyIsReadFromOzoneConfiguration(String compactionType) 
{
+    // unset or invalid values should use the default value
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION, 
compactionType);
+    assertEquals(ManagedCompactRangeOptions.BottommostLevelCompaction.kSkip, 
getBottommostLevelCompaction(conf));
+  }
+
+  @ParameterizedTest
+  @ValueSource(strings = {"kForce", " kForce", "kForce ", " kForce "})
+  void testConfigKeyIsReadFromOzoneConfiguration(String compactionType) {
+    // have trailing spaces in the config values to ensure they are trimmed 
and handled correctly
+    OzoneConfiguration  conf = new OzoneConfiguration();
+    conf.set(OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION, 
compactionType);
+    assertEquals(ManagedCompactRangeOptions.BottommostLevelCompaction.kForce, 
getBottommostLevelCompaction(conf));
+  }
+}
diff --git 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactionService.java
 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactionService.java
index d2542315670..4299abd6253 100644
--- 
a/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactionService.java
+++ 
b/hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/service/TestCompactionService.java
@@ -17,8 +17,10 @@
 
 package org.apache.hadoop.ozone.om.service;
 
+import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_ENABLED;
 import static 
org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_COMPACTION_SERVICE_RUN_INTERVAL;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -39,6 +41,7 @@
 import org.apache.hadoop.hdds.server.ServerUtils;
 import org.apache.hadoop.hdds.utils.db.DBConfigFromFile;
 import org.apache.hadoop.hdds.utils.db.TypedTable;
+import org.apache.hadoop.hdds.utils.db.managed.ManagedCompactRangeOptions;
 import org.apache.hadoop.ozone.om.OMConfigKeys;
 import org.apache.hadoop.ozone.om.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OzoneManager;
@@ -74,6 +77,7 @@ void setup(@TempDir Path tempDir) {
     ozoneManager = mock(OzoneManager.class);
     OMMetadataManager metadataManager = mock(OMMetadataManager.class);
     when(ozoneManager.getMetadataManager()).thenReturn(metadataManager);
+    when(ozoneManager.getConfiguration()).thenReturn(conf);
     TypedTable table = mock(TypedTable.class);
 
     Set<String> tables = new HashSet<>();
@@ -159,6 +163,35 @@ public void testCompactFailure() {
         () -> getCompactionService(compactTables));
   }
 
+  @Test
+  public void testDefaultCompactionLevelIsKSkip() {
+    CompactionService compactionService = 
getCompactionService(Arrays.asList("keyTable", "fileTable"));
+    assertEquals(ManagedCompactRangeOptions.BottommostLevelCompaction.kSkip,
+        compactionService.getBottommostLevelCompaction());
+  }
+
+  @Test
+  public void testConfiguredCompactionLevelKForce() {
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION, "kForce");
+    when(ozoneManager.getConfiguration()).thenReturn(conf);
+
+    CompactionService compactionService = 
getCompactionService(Arrays.asList("keyTable", "fileTable"));
+    assertEquals(ManagedCompactRangeOptions.BottommostLevelCompaction.kForce,
+        compactionService.getBottommostLevelCompaction());
+  }
+
+  @Test
+  public void testInvalidCompactionLevelFallsBackToDefault() {
+    OzoneConfiguration conf = new OzoneConfiguration();
+    conf.set(OZONE_OM_COMPACTION_SERVICE_BOTTOMMOSTLEVELCOMPACTION, 
"kForceeeee");
+    when(ozoneManager.getConfiguration()).thenReturn(conf);
+
+    CompactionService compactionService = 
getCompactionService(Arrays.asList("keyTable", "fileTable"));
+    assertEquals(ManagedCompactRangeOptions.BottommostLevelCompaction.kSkip,
+        compactionService.getBottommostLevelCompaction());
+  }
+
   private CompactionService getCompactionService(List<String> compactTables) {
     CompactionService compactionService = new CompactionService(ozoneManager, 
TimeUnit.MILLISECONDS,
         TimeUnit.SECONDS.toMillis(SERVICE_INTERVAL), 
TimeUnit.SECONDS.toMillis(60), compactTables) {
diff --git a/pom.xml b/pom.xml
index dba5db5c157..f06d57e84a8 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1972,6 +1972,7 @@
                     <allowedImports>
                       <!-- Allow non-RocksObject classes. -->
                       
<allowedImport>org.rocksdb.ColumnFamilyDescriptor</allowedImport>
+                      
<allowedImport>org.rocksdb.CompactRangeOptions.BottommostLevelCompaction</allowedImport>
                       
<allowedImport>org.rocksdb.CompactionStyle</allowedImport>
                       <allowedImport>org.rocksdb.KeyMayExist</allowedImport>
                       <allowedImport>org.rocksdb.HistogramData</allowedImport>


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to