Skip to content

Commit 0e1b03c

Browse files
ptlrssarvekshayr
andauthored
HDDS-15466. Make RocksDB bottommost level compaction options configurable for CLI tools (#10428)
Co-authored-by: Sarveksha Yeshavantha Raju <79865743+sarvekshayr@users.noreply.github.com>
1 parent eb2fb3f commit 0e1b03c

11 files changed

Lines changed: 84 additions & 22 deletions

File tree

hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/ldb/RocksDBManualCompaction.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727
import org.apache.hadoop.hdds.utils.db.managed.ManagedDBOptions;
2828
import org.apache.hadoop.hdds.utils.db.managed.ManagedRocksDB;
2929
import org.apache.hadoop.ozone.debug.RocksDBUtils;
30+
import org.apache.hadoop.ozone.om.service.CompactDBUtil;
3031
import org.apache.hadoop.ozone.repair.RepairTool;
3132
import org.apache.hadoop.util.Time;
3233
import org.rocksdb.ColumnFamilyDescriptor;
@@ -62,6 +63,13 @@ public class RocksDBManualCompaction extends RepairTool {
6263
description = "Column family name")
6364
private String columnFamilyName;
6465

66+
@CommandLine.Option(names = {"--bottommost-level-compaction", "--blc"},
67+
description = "BottommostLevelCompaction option for RocksDB compaction." +
68+
" Valid values: 0 (kSkip), 1 (kIfHaveCompactionFilter), 2 (kForce), 3 (kForceOptimized).",
69+
defaultValue = "0",
70+
showDefaultValue = CommandLine.Help.Visibility.ALWAYS)
71+
private int bottommostLevelCompaction;
72+
6573
private String getConsoleReadLineWithFormat() {
6674
err().printf(WARNING_TO_STOP_SERVICE);
6775
return getScanner().nextLine().trim();
@@ -96,11 +104,14 @@ public void execute() throws Exception {
96104
" is not in a column family in DB for the given path.");
97105
}
98106

99-
info("Running compaction on " + columnFamilyName);
107+
ManagedCompactRangeOptions.BottommostLevelCompaction blcOption =
108+
CompactDBUtil.getBottommostLevelCompaction(bottommostLevelCompaction);
109+
info("Running compaction on " + columnFamilyName +
110+
" with bottommost level compaction: " + blcOption.name());
100111
long startTime = Time.monotonicNow();
101112
if (!isDryRun()) {
102113
ManagedCompactRangeOptions compactOptions = new ManagedCompactRangeOptions();
103-
compactOptions.setBottommostLevelCompaction(ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
114+
compactOptions.setBottommostLevelCompaction(blcOption);
104115
db.get().compactRange(cfh, null, null, compactOptions);
105116
}
106117
long duration = Time.monotonicNow() - startTime;

hadoop-ozone/cli-repair/src/main/java/org/apache/hadoop/ozone/repair/om/CompactOMDB.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@
2020
import java.io.IOException;
2121
import org.apache.hadoop.hdds.cli.HddsVersionProvider;
2222
import org.apache.hadoop.hdds.conf.OzoneConfiguration;
23+
import org.apache.hadoop.hdds.utils.db.managed.ManagedCompactRangeOptions;
2324
import org.apache.hadoop.ozone.om.helpers.OMNodeDetails;
2425
import org.apache.hadoop.ozone.om.protocolPB.OMAdminProtocolClientSideImpl;
26+
import org.apache.hadoop.ozone.om.service.CompactDBUtil;
2527
import org.apache.hadoop.ozone.repair.RepairTool;
2628
import org.apache.hadoop.security.UserGroupInformation;
2729
import picocli.CommandLine;
@@ -58,18 +60,28 @@ public class CompactOMDB extends RepairTool {
5860
)
5961
private String nodeId;
6062

63+
@CommandLine.Option(names = {"--bottommost-level-compaction", "--blc"},
64+
description = "BottommostLevelCompaction option for RocksDB compaction." +
65+
" Valid values: 0 (kSkip), 1 (kIfHaveCompactionFilter), 2 (kForce), 3 (kForceOptimized).",
66+
defaultValue = "0",
67+
showDefaultValue = CommandLine.Help.Visibility.ALWAYS)
68+
private int bottommostLevelCompaction;
69+
6170
@Override
6271
public void execute() throws Exception {
6372

6473
OzoneConfiguration conf = getOzoneConf();
6574
OMNodeDetails omNodeDetails = OMNodeDetails.getOMNodeDetailsFromConf(
6675
conf, omServiceId, nodeId);
76+
ManagedCompactRangeOptions.BottommostLevelCompaction blcOption =
77+
CompactDBUtil.getBottommostLevelCompaction(bottommostLevelCompaction);
6778
if (!isDryRun()) {
6879
try (OMAdminProtocolClientSideImpl omAdminProtocolClient =
6980
OMAdminProtocolClientSideImpl.createProxyForSingleOM(conf,
7081
UserGroupInformation.getCurrentUser(), omNodeDetails)) {
71-
omAdminProtocolClient.compactOMDB(columnFamilyName);
72-
info("Compaction request issued for om.db of om node: %s, column-family: %s.", nodeId, columnFamilyName);
82+
omAdminProtocolClient.compactOMDB(columnFamilyName, blcOption.getValue());
83+
info("Compaction request issued for om.db of om node: %s, column-family: %s" +
84+
" with bottommost level compaction: %s.", nodeId, columnFamilyName, blcOption.name());
7385
info("Please check role logs of %s for completion status.", nodeId);
7486
} catch (IOException ex) {
7587
error("Couldn't compact column %s. \nException: %s", columnFamilyName, ex);

hadoop-ozone/cli-repair/src/test/java/org/apache/hadoop/ozone/repair/ldb/TestLdbRepair.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,8 @@ public void testRocksDBManualCompaction() throws Exception {
125125
CommandLine cmd = new CommandLine(compactionTool);
126126
String[] args = {
127127
"--db", dbPath.toString(),
128-
"--column-family", TEST_CF_NAME
128+
"--column-family", TEST_CF_NAME,
129+
"--blc", "2"
129130
};
130131
// Pass two "y" inputs - one for user confirmation and the other for warning to stop service
131132
int exitCode = withTextFromSystemIn("y", "y")

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocol/OMAdminProtocol.java

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,14 @@ public interface OMAdminProtocol extends Closeable {
4141
void decommission(OMNodeDetails removeOMNode) throws IOException;
4242

4343
/**
44-
* Requests compaction of a column family of om.db.
45-
* @param columnFamily
44+
* Requests compaction of a column family of om.db with the specified
45+
* BottommostLevelCompaction option.
46+
*
47+
* @param columnFamily column family name
48+
* @param bottommostLevelCompaction rocksId of BottommostLevelCompaction
49+
* (0=kSkip, 1=kIfHaveCompactionFilter, 2=kForce, 3=kForceOptimized)
4650
*/
47-
void compactOMDB(String columnFamily) throws IOException;
51+
void compactOMDB(String columnFamily, int bottommostLevelCompaction) throws IOException;
4852

4953
/**
5054
* Triggers the Snapshot Defragmentation Service to run immediately.

hadoop-ozone/common/src/main/java/org/apache/hadoop/ozone/om/protocolPB/OMAdminProtocolClientSideImpl.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,9 +216,10 @@ public void decommission(OMNodeDetails removeOMNode) throws IOException {
216216
}
217217

218218
@Override
219-
public void compactOMDB(String columnFamily) throws IOException {
219+
public void compactOMDB(String columnFamily, int bottommostLevelCompaction) throws IOException {
220220
CompactRequest compactRequest = CompactRequest.newBuilder()
221221
.setColumnFamily(columnFamily)
222+
.setBottommostLevelCompaction(bottommostLevelCompaction)
222223
.build();
223224
CompactResponse response;
224225
try {

hadoop-ozone/dist/src/main/smoketest/repair/om-compact.robot

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ Get OM DB SST Files Size
3434

3535
Compact OM DB Column Family
3636
[Arguments] ${column_family}
37-
Execute ozone repair om compact --cf=${column_family} --service-id ${OM_SERVICE_ID} --node-id om1
37+
Execute ozone repair om compact --cf=${column_family} --service-id ${OM_SERVICE_ID} --node-id om1 --blc 2
3838

3939
*** Test Cases ***
4040
Testing OM DB Size Reduction After Compaction

hadoop-ozone/interface-client/src/main/proto/OMAdminProtocol.proto

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,10 @@ message DecommissionOMResponse {
7272

7373
message CompactRequest {
7474
required string columnFamily = 1;
75+
// BottommostLevelCompaction option:
76+
// 0=kSkip, 1=kIfHaveCompactionFilter, 2=kForce, 3=kForceOptimized.
77+
// Defaults to kSkip (0) if not set.
78+
optional int32 bottommostLevelCompaction = 2 [default = 0];
7579
}
7680

7781
message CompactResponse {

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OzoneManager.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,7 @@
221221
import org.apache.hadoop.hdds.utils.db.TableIterator;
222222
import org.apache.hadoop.hdds.utils.db.cache.CacheKey;
223223
import org.apache.hadoop.hdds.utils.db.cache.CacheValue;
224+
import org.apache.hadoop.hdds.utils.db.managed.ManagedCompactRangeOptions;
224225
import org.apache.hadoop.io.Text;
225226
import org.apache.hadoop.ipc_.ProtobufRpcEngine;
226227
import org.apache.hadoop.ipc_.RPC;
@@ -5663,10 +5664,11 @@ public void checkFeatureEnabled(OzoneManagerVersion feature) throws OMException
56635664
}
56645665
}
56655666

5666-
public void compactOMDB(String columnFamily) throws IOException {
5667+
public void compactOMDB(String columnFamily,
5668+
ManagedCompactRangeOptions.BottommostLevelCompaction bottommostLevelCompaction) throws IOException {
56675669
checkAdminUserPrivilege("compact column family " + columnFamily);
56685670
CompletableFuture<Void> compactFuture =
5669-
CompactDBUtil.compactTableAsync(metadataManager, columnFamily);
5671+
CompactDBUtil.compactTableAsync(metadataManager, columnFamily, bottommostLevelCompaction);
56705672
compactFuture.whenComplete((result, throwable) -> {
56715673
if (throwable == null) {
56725674
LOG.info("Compaction request for column family \"{}\" completed successfully.",

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactDBUtil.java

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,13 @@ public final class CompactDBUtil {
3838
private CompactDBUtil() {
3939
}
4040

41-
public static void compactTable(OMMetadataManager omMetadataManager,
42-
String tableName) throws IOException {
41+
public static void compactTable(OMMetadataManager omMetadataManager, String tableName,
42+
ManagedCompactRangeOptions.BottommostLevelCompaction compactionType) throws IOException {
4343
long startTime = Time.monotonicNow();
44-
LOG.info("Compacting column family: {}", tableName);
4544
try (ManagedCompactRangeOptions options = new ManagedCompactRangeOptions()) {
46-
options.setBottommostLevelCompaction(
47-
ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
45+
options.setBottommostLevelCompaction(compactionType);
46+
LOG.info("Compacting column family: {} with {} bottommost level compaction",
47+
tableName, options.bottommostLevelCompaction());
4848
options.setExclusiveManualCompaction(true);
4949
RocksDatabase rocksDatabase =
5050
((RDBStore) omMetadataManager.getStore()).getDb();
@@ -62,14 +62,34 @@ public static void compactTable(OMMetadataManager omMetadataManager,
6262
}
6363
}
6464

65-
public static CompletableFuture<Void> compactTableAsync(OMMetadataManager metadataManager, String tableName) {
65+
public static CompletableFuture<Void> compactTableAsync(OMMetadataManager metadataManager, String tableName,
66+
ManagedCompactRangeOptions.BottommostLevelCompaction compactionType) {
6667
return CompletableFuture.runAsync(() -> {
6768
try {
68-
compactTable(metadataManager, tableName);
69+
compactTable(metadataManager, tableName, compactionType);
6970
} catch (Exception e) {
7071
LOG.warn("Failed to compact column family: {}", tableName, e);
7172
throw new CompletionException("Compaction failed for column family: " + tableName, e);
7273
}
7374
});
7475
}
76+
77+
/**
78+
* Converts the given RocksDB id to a
79+
* {@link ManagedCompactRangeOptions.BottommostLevelCompaction} enum value.
80+
* Defaults to {@code kSkip} if the id is invalid.
81+
*
82+
* @param bottommostLevelCompaction RocksDB id
83+
* (0=kSkip, 1=kIfHaveCompactionFilter, 2=kForce, 3=kForceOptimized).
84+
*/
85+
public static ManagedCompactRangeOptions.BottommostLevelCompaction getBottommostLevelCompaction(
86+
int bottommostLevelCompaction) {
87+
ManagedCompactRangeOptions.BottommostLevelCompaction level =
88+
ManagedCompactRangeOptions.BottommostLevelCompaction.fromRocksId(bottommostLevelCompaction);
89+
if (level == null) {
90+
LOG.warn("Invalid bottommost level compaction id: {}. Using default: kSkip.", bottommostLevelCompaction);
91+
return ManagedCompactRangeOptions.BottommostLevelCompaction.kSkip;
92+
}
93+
return level;
94+
}
7595
}

hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/service/CompactionService.java

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import org.apache.hadoop.hdds.utils.BackgroundTask;
3333
import org.apache.hadoop.hdds.utils.BackgroundTaskQueue;
3434
import org.apache.hadoop.hdds.utils.BackgroundTaskResult;
35+
import org.apache.hadoop.hdds.utils.db.managed.ManagedCompactRangeOptions;
3536
import org.apache.hadoop.ozone.om.OMMetadataManager;
3637
import org.apache.hadoop.ozone.om.OzoneManager;
3738
import org.slf4j.Logger;
@@ -141,11 +142,13 @@ private boolean shouldRun() {
141142
* @return CompletableFuture that completes when compaction finishes
142143
*/
143144
public CompletableFuture<Void> compactTableAsync(String tableName) {
144-
return CompactDBUtil.compactTableAsync(omMetadataManager, tableName);
145+
return CompactDBUtil.compactTableAsync(omMetadataManager, tableName,
146+
ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
145147
}
146148

147149
protected void compactFully(String tableName) throws IOException {
148-
CompactDBUtil.compactTable(omMetadataManager, tableName);
150+
CompactDBUtil.compactTable(omMetadataManager, tableName,
151+
ManagedCompactRangeOptions.BottommostLevelCompaction.kForce);
149152
}
150153

151154
private class CompactTask implements BackgroundTask {

0 commit comments

Comments
 (0)