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]