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

weichiu 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 e8aa94869ad HDDS-14411. Combine CompactionService and CompactDBService 
(#9663)
e8aa94869ad is described below

commit e8aa94869ad85cb11a91692c51c36b1d418a6df8
Author: Ming Wei <[email protected]>
AuthorDate: Sat Mar 7 05:11:52 2026 +0800

    HDDS-14411. Combine CompactionService and CompactDBService (#9663)
---
 .../org/apache/hadoop/ozone/om/OzoneManager.java   | 18 +++++-
 .../hadoop/ozone/om/service/CompactDBService.java  | 70 --------------------
 .../hadoop/ozone/om/service/CompactDBUtil.java     | 75 ++++++++++++++++++++++
 .../hadoop/ozone/om/service/CompactionService.java | 37 +++++------
 4 files changed, 106 insertions(+), 94 deletions(-)

diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
index cf10e6643f3..09f1d8b0148 100644
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java
@@ -143,6 +143,8 @@
 import java.util.Timer;
 import java.util.TimerTask;
 import java.util.UUID;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ExecutorService;
 import java.util.concurrent.Executors;
@@ -282,7 +284,7 @@
 import org.apache.hadoop.ozone.om.request.OMClientRequest;
 import org.apache.hadoop.ozone.om.s3.S3SecretCacheProvider;
 import org.apache.hadoop.ozone.om.s3.S3SecretStoreProvider;
-import org.apache.hadoop.ozone.om.service.CompactDBService;
+import org.apache.hadoop.ozone.om.service.CompactDBUtil;
 import org.apache.hadoop.ozone.om.service.DirectoryDeletingService;
 import org.apache.hadoop.ozone.om.service.OMRangerBGSyncService;
 import org.apache.hadoop.ozone.om.service.QuotaRepairTask;
@@ -5402,7 +5404,19 @@ public void checkFeatureEnabled(OzoneManagerVersion 
feature) throws OMException
 
   public void compactOMDB(String columnFamily) throws IOException {
     checkAdminUserPrivilege("compact column family " + columnFamily);
-    new CompactDBService(this).compact(columnFamily);
+    CompletableFuture<Void> compactFuture =
+        CompactDBUtil.compactTableAsync(metadataManager, columnFamily);
+    compactFuture.whenComplete((result, throwable) -> {
+      if (throwable == null) {
+        LOG.info("Compaction request for column family \"{}\" completed 
successfully.",
+            columnFamily);
+      } else {
+        Throwable cause = throwable instanceof CompletionException
+            && throwable.getCause() != null ? throwable.getCause() : throwable;
+        LOG.error("Compaction request for column family \"{}\" failed.",
+            columnFamily, cause);
+      }
+    });
   }
 
   public OMExecutionFlow getOmExecutionFlow() {
diff --git 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBService.java
 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBService.java
deleted file mode 100644
index f39521c9219..00000000000
--- 
a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBService.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * 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 java.io.IOException;
-import java.util.concurrent.CompletableFuture;
-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.OzoneManager;
-import org.apache.hadoop.util.Time;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-/**
- * This service issues a compaction request for a column family of om.db.
- */
-public class CompactDBService {
-  private static final Logger LOG = LoggerFactory.getLogger(
-      CompactDBService.class);
-  private final OzoneManager om;
-
-  public CompactDBService(OzoneManager ozoneManager) {
-    this.om = ozoneManager;
-  }
-
-  public CompletableFuture<Void> compact(String columnFamily) throws
-      IOException {
-    return CompletableFuture.supplyAsync(() -> {
-      try {
-        return compactAsync(columnFamily);
-      } catch (Exception e) {
-        LOG.warn("Failed to compact column family: {}", columnFamily, e);
-      }
-      return null;
-    });
-  }
-
-  private Void compactAsync(String columnFamilyName) throws IOException {
-    LOG.info("Compacting column family: {}", columnFamilyName);
-    long startTime = Time.monotonicNow();
-    ManagedCompactRangeOptions options =
-        new ManagedCompactRangeOptions();
-    options.setBottommostLevelCompaction(
-        ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
-    // Find CF Handler
-    RocksDatabase.ColumnFamily columnFamily =
-        
((RDBStore)om.getMetadataManager().getStore()).getDb().getColumnFamily(columnFamilyName);
-    ((RDBStore)om.getMetadataManager().getStore()).getDb().compactRange(
-        columnFamily, null, null, options);
-    LOG.info("Compaction of column family: {} completed in {} ms",
-        columnFamilyName, Time.monotonicNow() - startTime);
-    return null;
-  }
-}
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
new file mode 100644
index 00000000000..6eb52abbcfa
--- /dev/null
+++ 
b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBUtil.java
@@ -0,0 +1,75 @@
+/*
+ * 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 java.io.IOException;
+import java.util.concurrent.CompletableFuture;
+import java.util.concurrent.CompletionException;
+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.OMMetadataManager;
+import org.apache.hadoop.util.Time;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+/**
+ * Utility class for compacting OM RocksDB column families.
+ */
+public final class CompactDBUtil {
+  private static final Logger LOG =
+      LoggerFactory.getLogger(CompactDBUtil.class);
+
+  private CompactDBUtil() {
+  }
+
+  public static void compactTable(OMMetadataManager omMetadataManager,
+                                  String tableName) throws IOException {
+    long startTime = Time.monotonicNow();
+    LOG.info("Compacting column family: {}", tableName);
+    try (ManagedCompactRangeOptions options = new 
ManagedCompactRangeOptions()) {
+      options.setBottommostLevelCompaction(
+          ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
+      options.setExclusiveManualCompaction(true);
+      RocksDatabase rocksDatabase =
+          ((RDBStore) omMetadataManager.getStore()).getDb();
+
+      RocksDatabase.ColumnFamily columnFamily =
+          rocksDatabase.getColumnFamily(tableName);
+      if (columnFamily == null) {
+        LOG.error("Unable to trigger compaction for \"{}\". Column family not 
found ",
+            tableName);
+        throw new IOException("Column family \"" + tableName + "\" not 
found.");
+      }
+      rocksDatabase.compactRange(columnFamily, null, null, options);
+      LOG.info("Compaction of column family: {} completed in {} ms",
+          tableName, Time.monotonicNow() - startTime);
+    }
+  }
+
+  public static CompletableFuture<Void> compactTableAsync(OMMetadataManager 
metadataManager, String tableName) {
+    return CompletableFuture.runAsync(() -> {
+      try {
+        compactTable(metadataManager, tableName);
+      } catch (Exception e) {
+        LOG.warn("Failed to compact column family: {}", tableName, e);
+        throw new CompletionException("Compaction failed for column family: " 
+ tableName, e);
+      }
+    });
+  }
+}
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 dfcc32578ad..ec24fe117bb 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
@@ -24,6 +24,7 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
@@ -31,12 +32,8 @@
 import org.apache.hadoop.hdds.utils.BackgroundTask;
 import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
 import org.apache.hadoop.hdds.utils.BackgroundTaskResult;
-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.OMMetadataManager;
 import org.apache.hadoop.ozone.om.OzoneManager;
-import org.apache.hadoop.util.Time;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -134,25 +131,21 @@ private boolean shouldRun() {
     return !suspended.get();
   }
 
+  /**
+   * Compact a specific table asynchronously. This method returns immediately
+   * with a CompletableFuture that completes when the compaction finishes.
+   * This is useful for on-demand compaction requests (e.g., via admin RPC)
+   * where the caller doesn't need to wait for completion.
+   *
+   * @param tableName the name of the table to compact
+   * @return CompletableFuture that completes when compaction finishes
+   */
+  public CompletableFuture<Void> compactTableAsync(String tableName) {
+    return CompactDBUtil.compactTableAsync(omMetadataManager, tableName);
+  }
+
   protected void compactFully(String tableName) throws IOException {
-    long startTime = Time.monotonicNow();
-    LOG.info("Compacting column family: {}", tableName);
-    try (ManagedCompactRangeOptions options = new 
ManagedCompactRangeOptions()) {
-      
options.setBottommostLevelCompaction(ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
-      options.setExclusiveManualCompaction(true);
-      RocksDatabase rocksDatabase = ((RDBStore) 
omMetadataManager.getStore()).getDb();
-
-      try {
-        // Find CF Handler
-        RocksDatabase.ColumnFamily columnFamily = 
rocksDatabase.getColumnFamily(tableName);
-        rocksDatabase.compactRange(columnFamily, null, null, options);
-        LOG.info("Compaction of column family: {} completed in {} ms",
-            tableName, Time.monotonicNow() - startTime);
-      } catch (NullPointerException ex) {
-        LOG.error("Unable to trigger compaction for \"{}\". Column family not 
found ", tableName);
-        throw new IOException("Column family \"" + tableName + "\" not 
found.");
-      }
-    }
+    CompactDBUtil.compactTable(omMetadataManager, tableName);
   }
 
   private class CompactTask implements BackgroundTask {


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

Reply via email to