Skip to content

Commit ad0debf

Browse files
SaketaChalamchalarohit-kb
authored andcommitted
CDPD-78671: HDDS-12193. Provide option to disable RDBStoreMetrics for Snapshotted DB (#7982)
Change-Id: I700aad96cd81c777e5342a82b08baaf6011fd0ed
1 parent e0a7160 commit ad0debf

7 files changed

Lines changed: 66 additions & 17 deletions

File tree

hadoop-hdds/common/src/main/resources/ozone-default.xml

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1401,6 +1401,15 @@
14011401
</description>
14021402
</property>
14031403

1404+
<property>
1405+
<name>ozone.om.snapshot.rocksdb.metrics.enabled</name>
1406+
<value>false</value>
1407+
<tag>OZONE, OM</tag>
1408+
<description>
1409+
Skip collecting RocksDBStore metrics for Snapshotted DB.
1410+
</description>
1411+
</property>
1412+
14041413
<property>
14051414
<name>hdds.rest.http-address</name>
14061415
<value>0.0.0.0:9880</value>

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ public final class DBStoreBuilder {
105105
private final DBProfile defaultCfProfile;
106106
private boolean enableCompactionDag;
107107
private boolean createCheckpointDirs = true;
108+
private boolean enableRocksDbMetrics = true;
108109
// this is to track the total size of dbUpdates data since sequence
109110
// number in request to avoid increase in heap memory.
110111
private long maxDbUpdatesSizeThreshold;
@@ -234,7 +235,7 @@ public DBStore build() throws IOException {
234235
return new RDBStore(dbFile, rocksDBOption, statistics, writeOptions, tableConfigs,
235236
registry.build(), openReadOnly, maxFSSnapshots, dbJmxBeanNameName,
236237
enableCompactionDag, maxDbUpdatesSizeThreshold, createCheckpointDirs,
237-
configuration);
238+
configuration, enableRocksDbMetrics);
238239
} finally {
239240
tableConfigs.forEach(TableConfig::close);
240241
}
@@ -304,6 +305,11 @@ public DBStoreBuilder setCreateCheckpointDirs(boolean createCheckpointDirs) {
304305
this.createCheckpointDirs = createCheckpointDirs;
305306
return this;
306307
}
308+
309+
public DBStoreBuilder setEnableRocksDbMetrics(boolean enableRocksDbMetrics) {
310+
this.enableRocksDbMetrics = enableRocksDbMetrics;
311+
return this;
312+
}
307313
/**
308314
* Set the {@link ManagedDBOptions} and default
309315
* {@link ManagedColumnFamilyOptions} based on {@code prof}.

hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,8 @@ public RDBStore(File dbFile, ManagedDBOptions dbOptions, ManagedStatistics stati
8888
String dbJmxBeanName, boolean enableCompactionDag,
8989
long maxDbUpdatesSizeThreshold,
9090
boolean createCheckpointDirs,
91-
ConfigurationSource configuration)
91+
ConfigurationSource configuration,
92+
boolean enableRocksDBMetrics)
9293

9394
throws IOException {
9495
Preconditions.checkNotNull(dbFile, "DB file location cannot be null");
@@ -122,13 +123,18 @@ public RDBStore(File dbFile, ManagedDBOptions dbOptions, ManagedStatistics stati
122123
dbJmxBeanName = dbFile.getName();
123124
}
124125
// Use statistics instead of dbOptions.statistics() to avoid repeated init.
125-
metrics = RocksDBStoreMetrics.create(statistics, db, dbJmxBeanName);
126-
if (metrics == null) {
127-
LOG.warn("Metrics registration failed during RocksDB init, " +
126+
if (!enableRocksDBMetrics) {
127+
LOG.debug("Skipped Metrics registration during RocksDB init, " +
128128
"db path :{}", dbJmxBeanName);
129129
} else {
130-
LOG.debug("Metrics registration succeed during RocksDB init, " +
131-
"db path :{}", dbJmxBeanName);
130+
metrics = RocksDBStoreMetrics.create(statistics, db, dbJmxBeanName);
131+
if (metrics == null) {
132+
LOG.warn("Metrics registration failed during RocksDB init, " +
133+
"db path :{}", dbJmxBeanName);
134+
} else {
135+
LOG.debug("Metrics registration succeed during RocksDB init, " +
136+
"db path :{}", dbJmxBeanName);
137+
}
132138
}
133139

134140
// Create checkpoints and snapshot directories if not exists.

hadoop-hdds/framework/src/test/java/org/apache/hadoop/hdds/utils/db/TestRDBStore.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public static RDBStore newRDBStore(File dbFile, ManagedDBOptions options,
6060
throws IOException {
6161
return new RDBStore(dbFile, options, null, new ManagedWriteOptions(), families,
6262
CodecRegistry.newBuilder().build(), false, 1000, null, false,
63-
maxDbUpdatesSizeThreshold, true, null);
63+
maxDbUpdatesSizeThreshold, true, null, true);
6464
}
6565

6666
public static final int MAX_DB_UPDATES_SIZE_THRESHOLD = 80;

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,10 @@ private OMConfigKeys() {
137137
public static final String OZONE_OM_METRICS_SAVE_INTERVAL =
138138
"ozone.om.save.metrics.interval";
139139
public static final String OZONE_OM_METRICS_SAVE_INTERVAL_DEFAULT = "5m";
140+
public static final String OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED =
141+
"ozone.om.snapshot.rocksdb.metrics.enabled";
142+
public static final boolean
143+
OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED_DEFAULT = false;
140144

141145
/**
142146
* OM Ratis related configurations.

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

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,10 @@
100100
import static org.apache.hadoop.ozone.OzoneConsts.OM_KEY_PREFIX;
101101
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_FS_SNAPSHOT_MAX_LIMIT;
102102
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_FS_SNAPSHOT_MAX_LIMIT_DEFAULT;
103+
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES;
104+
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES_DEFAULT;
105+
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED;
106+
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED_DEFAULT;
103107
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_CHECKPOINT_DIR_CREATION_POLL_TIMEOUT;
104108
import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_SNAPSHOT_CHECKPOINT_DIR_CREATION_POLL_TIMEOUT_DEFAULT;
105109
import static org.apache.hadoop.ozone.om.OmSnapshotManager.getSnapshotPrefix;
@@ -368,8 +372,10 @@ private OmMetadataManagerImpl(OzoneConfiguration conf, File dir, String name)
368372
throws IOException {
369373
lock = new OmReadOnlyLock();
370374
omEpoch = 0;
371-
setStore(loadDB(conf, dir, name, true,
372-
java.util.Optional.of(Boolean.TRUE), Optional.empty()));
375+
int maxOpenFiles = conf.getInt(OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES, OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES_DEFAULT);
376+
377+
setStore(loadDB(conf, dir, name, true, Optional.of(Boolean.TRUE),
378+
Optional.of(maxOpenFiles), false, false, true));
373379
initializeOmTables(CacheType.PARTIAL_CACHE, false);
374380
}
375381

@@ -401,8 +407,9 @@ private OmMetadataManagerImpl(OzoneConfiguration conf, File dir, String name)
401407
checkSnapshotDirExist(checkpoint);
402408
}
403409
setStore(loadDB(conf, metaDir, dbName, false,
404-
java.util.Optional.of(Boolean.TRUE),
405-
Optional.of(maxOpenFiles), false, false));
410+
java.util.Optional.of(Boolean.TRUE), Optional.of(maxOpenFiles), false, false,
411+
conf.getBoolean(OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED,
412+
OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED_DEFAULT)));
406413
initializeOmTables(CacheType.PARTIAL_CACHE, false);
407414
} catch (IOException e) {
408415
stop();
@@ -551,7 +558,7 @@ public void start(OzoneConfiguration configuration) throws IOException {
551558
public static DBStore loadDB(OzoneConfiguration configuration, File metaDir)
552559
throws IOException {
553560
return loadDB(configuration, metaDir, OM_DB_NAME, false,
554-
java.util.Optional.empty(), Optional.empty(), true, true);
561+
java.util.Optional.empty(), Optional.empty(), true, true, true);
555562
}
556563

557564
public static DBStore loadDB(OzoneConfiguration configuration, File metaDir,
@@ -561,7 +568,7 @@ public static DBStore loadDB(OzoneConfiguration configuration, File metaDir,
561568
java.util.Optional<Integer> maxOpenFiles)
562569
throws IOException {
563570
return loadDB(configuration, metaDir, dbName, readOnly,
564-
disableAutoCompaction, maxOpenFiles, true, true);
571+
disableAutoCompaction, maxOpenFiles, true, true, true);
565572
}
566573

567574
@SuppressWarnings("checkstyle:parameternumber")
@@ -571,7 +578,8 @@ public static DBStore loadDB(OzoneConfiguration configuration, File metaDir,
571578
disableAutoCompaction,
572579
java.util.Optional<Integer> maxOpenFiles,
573580
boolean enableCompactionDag,
574-
boolean createCheckpointDirs)
581+
boolean createCheckpointDirs,
582+
boolean enableRocksDBMetrics)
575583
throws IOException {
576584
final int maxFSSnapshots = configuration.getInt(
577585
OZONE_OM_FS_SNAPSHOT_MAX_LIMIT, OZONE_OM_FS_SNAPSHOT_MAX_LIMIT_DEFAULT);
@@ -583,7 +591,8 @@ public static DBStore loadDB(OzoneConfiguration configuration, File metaDir,
583591
.setPath(Paths.get(metaDir.getPath()))
584592
.setMaxFSSnapshots(maxFSSnapshots)
585593
.setEnableCompactionDag(enableCompactionDag)
586-
.setCreateCheckpointDirs(createCheckpointDirs);
594+
.setCreateCheckpointDirs(createCheckpointDirs)
595+
.setEnableRocksDbMetrics(enableRocksDBMetrics);
587596
disableAutoCompaction.ifPresent(
588597
dbStoreBuilder::disableDefaultCFAutoCompaction);
589598
maxOpenFiles.ifPresent(dbStoreBuilder::setMaxNumberOfOpenFiles);

hadoop-ozone/ozone-manager/src/test/java/org/apache/hadoop/ozone/om/TestOmSnapshotManager.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.apache.hadoop.hdds.scm.HddsWhiteboxTestUtils;
2727
import org.apache.hadoop.hdds.utils.db.DBStore;
2828
import org.apache.hadoop.hdds.utils.db.RDBBatchOperation;
29+
import org.apache.hadoop.hdds.utils.db.RDBStore;
2930
import org.apache.hadoop.hdds.utils.db.Table;
3031
import org.apache.hadoop.ozone.om.helpers.OmBucketInfo;
3132
import org.apache.hadoop.ozone.om.helpers.OmVolumeArgs;
@@ -37,6 +38,7 @@
3738
import org.junit.Assert;
3839
import org.junit.Before;
3940
import org.junit.Test;
41+
import org.slf4j.event.Level;
4042

4143
import java.io.File;
4244
import java.io.IOException;
@@ -53,6 +55,7 @@
5355
import java.util.Set;
5456
import java.util.TreeMap;
5557
import java.util.UUID;
58+
import java.util.concurrent.TimeoutException;
5659

5760
import static org.apache.commons.io.file.PathUtils.copyDirectory;
5861
import static org.apache.hadoop.hdds.utils.HAUtils.getExistingSstFiles;
@@ -107,6 +110,8 @@ public void init() throws Exception {
107110
// Only allow one entry in cache so each new one causes an eviction
108111
configuration.setInt(
109112
OMConfigKeys.OZONE_OM_SNAPSHOT_CACHE_MAX_SIZE, 1);
113+
configuration.setBoolean(
114+
OMConfigKeys.OZONE_OM_SNAPSHOT_ROCKSDB_METRICS_ENABLED, false);
110115

111116
OmTestManagers omTestManagers = new OmTestManagers(configuration);
112117
om = omTestManagers.getOzoneManager();
@@ -138,8 +143,12 @@ public void testSnapshotFeatureFlagSafetyCheck() throws IOException {
138143
}
139144

140145
@Test
141-
public void testCloseOnEviction() throws IOException {
146+
public void testCloseOnEviction() throws IOException,
147+
InterruptedException, TimeoutException {
142148

149+
GenericTestUtils.setLogLevel(RDBStore.getLogger(), Level.DEBUG);
150+
GenericTestUtils.LogCapturer logCapture =
151+
GenericTestUtils.LogCapturer.captureLogs(RDBStore.getLogger());
143152
// set up db tables
144153
Table<String, OmVolumeArgs> volumeTable = mock(Table.class);
145154
Table<String, OmBucketInfo> bucketTable = mock(Table.class);
@@ -212,6 +221,12 @@ public void testCloseOnEviction() throws IOException {
212221

213222
// confirm store was closed
214223
verify(firstSnapshotStore, timeout(3000).times(1)).close();
224+
225+
// Verify RocksDBStoreMetrics registration is skipped.
226+
String msg = "Skipped Metrics registration during RocksDB init";
227+
GenericTestUtils.waitFor(() -> {
228+
return logCapture.getOutput().contains(msg);
229+
}, 100, 30_000);
215230
}
216231

217232
private void setupData() throws IOException {

0 commit comments

Comments
 (0)