diff --git a/hadoop-hdds/common/src/main/resources/ozone-default.xml b/hadoop-hdds/common/src/main/resources/ozone-default.xml index 87be7a509a20..fe64ea184f97 100644 --- a/hadoop-hdds/common/src/main/resources/ozone-default.xml +++ b/hadoop-hdds/common/src/main/resources/ozone-default.xml @@ -3894,6 +3894,19 @@ + + ozone.om.snapshot.db.max.open.files + 100 + OZONE, OM + + Max number of open files for each snapshot db present in the snapshot cache. + Essentially sets `max_open_files` config for RocksDB instances opened for Ozone snapshots. + This will limit the total number of files opened by a snapshot db thereby limiting the total number of + open file handles by snapshot dbs. + Max total number of open handles = (snapshot cache size * max open files) + + + ozone.om.snapshot.force.full.diff false diff --git a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java index bed044904e0e..7e7bdb0eccaa 100644 --- a/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java +++ b/hadoop-hdds/framework/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java @@ -105,6 +105,7 @@ public final class DBStoreBuilder { // this is to track the total size of dbUpdates data since sequence // number in request to avoid increase in heap memory. private long maxDbUpdatesSizeThreshold; + private Integer maxNumberOfOpenFiles = null; /** * Create DBStoreBuilder from a generic DBDefinition. @@ -182,6 +183,12 @@ private void applyDBDefinition(DBDefinition definition) { } } + private void setDBOptionsProps(ManagedDBOptions dbOptions) { + if (maxNumberOfOpenFiles != null) { + dbOptions.setMaxOpenFiles(maxNumberOfOpenFiles); + } + } + /** * Builds a DBStore instance and returns that. * @@ -200,7 +207,7 @@ public DBStore build() throws IOException { if (rocksDBOption == null) { rocksDBOption = getDefaultDBOptions(tableConfigs); } - + setDBOptionsProps(rocksDBOption); ManagedWriteOptions writeOptions = new ManagedWriteOptions(); writeOptions.setSync(rocksDBConfiguration.getSyncOption()); @@ -292,6 +299,11 @@ public DBStoreBuilder setProfile(DBProfile prof) { return this; } + public DBStoreBuilder setMaxNumberOfOpenFiles(Integer maxNumberOfOpenFiles) { + this.maxNumberOfOpenFiles = maxNumberOfOpenFiles; + return this; + } + /** * Converts column families and their corresponding options that have been * registered with the builder to a set of {@link TableConfig} objects. 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 9a7acb02f573..1f8d12be190c 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 @@ -494,6 +494,11 @@ private OMConfigKeys() { public static final String OZONE_OM_SNAPSHOT_DIFF_REPORT_MAX_PAGE_SIZE = "ozone.om.snapshot.diff.max.page.size"; + + public static final String OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES + = "ozone.om.snapshot.db.max.open.files"; + public static final int OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES_DEFAULT + = 100; public static final int OZONE_OM_SNAPSHOT_DIFF_REPORT_MAX_PAGE_SIZE_DEFAULT = 1000; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java index f6519bb098ec..09b48a0bec8e 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmMetadataManagerImpl.java @@ -354,14 +354,14 @@ private OmMetadataManagerImpl(OzoneConfiguration conf, File dir, String name) lock = new OmReadOnlyLock(); omEpoch = 0; setStore(loadDB(conf, dir, name, true, - java.util.Optional.of(Boolean.TRUE))); + java.util.Optional.of(Boolean.TRUE), Optional.empty())); initializeOmTables(false); } // metadata constructor for snapshots OmMetadataManagerImpl(OzoneConfiguration conf, String snapshotDirName, - boolean isSnapshotInCache) throws IOException { + boolean isSnapshotInCache, int maxOpenFiles) throws IOException { try { lock = new OmReadOnlyLock(); omEpoch = 0; @@ -380,7 +380,8 @@ private OmMetadataManagerImpl(OzoneConfiguration conf, File dir, String name) checkSnapshotDirExist(checkpoint); } setStore(loadDB(conf, metaDir, dbName, false, - java.util.Optional.of(Boolean.TRUE), false, false)); + java.util.Optional.of(Boolean.TRUE), + Optional.of(maxOpenFiles), false, false)); initializeOmTables(false); } catch (IOException e) { stop(); @@ -525,22 +526,25 @@ public void start(OzoneConfiguration configuration) throws IOException { public static DBStore loadDB(OzoneConfiguration configuration, File metaDir) throws IOException { return loadDB(configuration, metaDir, OM_DB_NAME, false, - java.util.Optional.empty(), true, true); + java.util.Optional.empty(), Optional.empty(), true, true); } public static DBStore loadDB(OzoneConfiguration configuration, File metaDir, String dbName, boolean readOnly, java.util.Optional - disableAutoCompaction) + disableAutoCompaction, + java.util.Optional maxOpenFiles) throws IOException { return loadDB(configuration, metaDir, dbName, readOnly, - disableAutoCompaction, true, true); + disableAutoCompaction, maxOpenFiles, true, true); } + @SuppressWarnings("checkstyle:parameternumber") public static DBStore loadDB(OzoneConfiguration configuration, File metaDir, String dbName, boolean readOnly, java.util.Optional disableAutoCompaction, + java.util.Optional maxOpenFiles, boolean enableCompactionDag, boolean createCheckpointDirs) throws IOException { @@ -557,6 +561,7 @@ public static DBStore loadDB(OzoneConfiguration configuration, File metaDir, .setCreateCheckpointDirs(createCheckpointDirs); disableAutoCompaction.ifPresent( dbStoreBuilder::disableDefaultCFAutoCompaction); + maxOpenFiles.ifPresent(dbStoreBuilder::setMaxNumberOfOpenFiles); return addOMTablesAndCodecs(dbStoreBuilder).build(); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java index cdd39ead3446..ca5637e82bc3 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/OmSnapshotManager.java @@ -80,6 +80,8 @@ import static org.apache.hadoop.ozone.OzoneConsts.OM_SNAPSHOT_INDICATOR; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_CACHE_MAX_SIZE; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_CACHE_MAX_SIZE_DEFAULT; +import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES; +import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES_DEFAULT; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DIFF_CLEANUP_SERVICE_RUN_INTERVAL; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DIFF_CLEANUP_SERVICE_RUN_INTERVAL_DEFAULT; import static org.apache.hadoop.ozone.om.OMConfigKeys.OZONE_OM_SNAPSHOT_DIFF_CLEANUP_SERVICE_TIMEOUT; @@ -147,6 +149,7 @@ public final class OmSnapshotManager implements AutoCloseable { "snap-diff-purged-job-table"; private final long diffCleanupServiceInterval; + private final int maxOpenSstFilesInSnapshotDb; private final ManagedColumnFamilyOptions columnFamilyOptions; private final ManagedDBOptions options; private final List columnFamilyDescriptors; @@ -180,7 +183,10 @@ public OmSnapshotManager(OzoneManager ozoneManager) { OZONE_OM_SNAPSHOT_DIFF_REPORT_MAX_PAGE_SIZE, OZONE_OM_SNAPSHOT_DIFF_REPORT_MAX_PAGE_SIZE_DEFAULT ); - + this.maxOpenSstFilesInSnapshotDb = ozoneManager.getConfiguration().getInt( + OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES, + OZONE_OM_SNAPSHOT_DB_MAX_OPEN_FILES_DEFAULT + ); ColumnFamilyHandle snapDiffJobCf; ColumnFamilyHandle snapDiffReportCf; ColumnFamilyHandle snapDiffPurgedJobCf; @@ -317,7 +323,8 @@ public OmSnapshot load(@Nonnull String snapshotTableKey) OMMetadataManager snapshotMetadataManager; try { snapshotMetadataManager = new OmMetadataManagerImpl(conf, - snapshotInfo.getCheckpointDirName(), isSnapshotInCache); + snapshotInfo.getCheckpointDirName(), isSnapshotInCache, + maxOpenSstFilesInSnapshotDb); } catch (IOException e) { LOG.error("Failed to retrieve snapshot: {}", snapshotTableKey); throw e; diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java index e1190fce00e8..2ad80844161c 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/SstFilteringService.java @@ -158,7 +158,8 @@ public BackgroundTaskResult call() throws Exception { try (RDBStore rdbStore = (RDBStore) OmMetadataManagerImpl .loadDB(ozoneManager.getConfiguration(), new File(snapshotCheckpointDir), - dbName, true, Optional.of(Boolean.TRUE), false, false)) { + dbName, true, Optional.of(Boolean.TRUE), + Optional.empty(), false, false)) { RocksDatabase db = rdbStore.getDb(); try (BootstrapStateHandler.Lock lock = getBootstrapStateLock().lock()) {