This is an automated email from the ASF dual-hosted git repository. arp pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hadoop-ozone.git
The following commit(s) were added to refs/heads/master by this push: new c6c9794 HDDS-2333. Enable sync option for OM non-HA. (#61) c6c9794 is described below commit c6c9794fc590371ad9c3b8fdcd7a36ed42909b40 Author: Bharat Viswanadham <bha...@apache.org> AuthorDate: Mon Oct 21 19:32:41 2019 -0700 HDDS-2333. Enable sync option for OM non-HA. (#61) --- .../hadoop/hdds/utils/db/DBStoreBuilder.java | 21 ++++++++++++++++++--- .../org/apache/hadoop/hdds/utils/db/RDBStore.java | 8 ++++---- .../hadoop/hdds/utils/db/RocksDBConfiguration.java | 16 ++++++++++++++++ .../hadoop/ozone/om/OmMetadataManagerImpl.java | 22 ++++++++++++++++++++-- .../ozone/om/ratis/OzoneManagerDoubleBuffer.java | 19 ++++++++++++------- 5 files changed, 70 insertions(+), 16 deletions(-) diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java index 263864f..5994252 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/DBStoreBuilder.java @@ -32,6 +32,7 @@ import org.rocksdb.InfoLogLevel; import org.rocksdb.RocksDB; import org.rocksdb.Statistics; import org.rocksdb.StatsLevel; +import org.rocksdb.WriteOptions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -70,6 +71,10 @@ public final class DBStoreBuilder { private RocksDBConfiguration rocksDBConfiguration; private DBStoreBuilder(OzoneConfiguration configuration) { + this(configuration, configuration.getObject(RocksDBConfiguration.class)); + } + private DBStoreBuilder(OzoneConfiguration configuration, + RocksDBConfiguration rocksDBConfiguration) { tables = new HashSet<>(); tableNames = new LinkedList<>(); this.configuration = configuration; @@ -77,14 +82,19 @@ public final class DBStoreBuilder { this.rocksDbStat = configuration.getTrimmed( OZONE_METADATA_STORE_ROCKSDB_STATISTICS, OZONE_METADATA_STORE_ROCKSDB_STATISTICS_DEFAULT); - this.rocksDBConfiguration = - configuration.getObject(RocksDBConfiguration.class); + this.rocksDBConfiguration = rocksDBConfiguration; } + public static DBStoreBuilder newBuilder(OzoneConfiguration configuration) { return new DBStoreBuilder(configuration); } + public static DBStoreBuilder newBuilder(OzoneConfiguration configuration, + RocksDBConfiguration rocksDBConfiguration) { + return new DBStoreBuilder(configuration, rocksDBConfiguration); + } + public DBStoreBuilder setProfile(DBProfile profile) { dbProfile = profile; return this; @@ -143,11 +153,16 @@ public final class DBStoreBuilder { processDBProfile(); processTables(); DBOptions options = getDbProfile(); + + WriteOptions writeOptions = new WriteOptions(); + writeOptions.setSync(rocksDBConfiguration.getSyncOption()); + + File dbFile = getDBFile(); if (!dbFile.getParentFile().exists()) { throw new IOException("The DB destination directory should exist."); } - return new RDBStore(dbFile, options, tables, registry); + return new RDBStore(dbFile, options, writeOptions, tables, registry); } /** diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java index 53bd424..0e3c208 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RDBStore.java @@ -71,10 +71,11 @@ public class RDBStore implements DBStore { @VisibleForTesting public RDBStore(File dbFile, DBOptions options, Set<TableConfig> families) throws IOException { - this(dbFile, options, families, new CodecRegistry()); + this(dbFile, options, new WriteOptions(), families, new CodecRegistry()); } - public RDBStore(File dbFile, DBOptions options, Set<TableConfig> families, + public RDBStore(File dbFile, DBOptions options, + WriteOptions writeOptions, Set<TableConfig> families, CodecRegistry registry) throws IOException { Preconditions.checkNotNull(dbFile, "DB file location cannot be null"); @@ -92,8 +93,7 @@ public class RDBStore implements DBStore { dbOptions = options; dbLocation = dbFile; - // TODO: Read from the next Config. - writeOptions = new WriteOptions(); + this.writeOptions = writeOptions; try { db = RocksDB.open(dbOptions, dbLocation.getAbsolutePath(), diff --git a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDBConfiguration.java b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDBConfiguration.java index 1a8c846..63e355c 100644 --- a/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDBConfiguration.java +++ b/hadoop-hdds/common/src/main/java/org/apache/hadoop/hdds/utils/db/RocksDBConfiguration.java @@ -59,4 +59,20 @@ public class RocksDBConfiguration { return rocksdbLogLevel; } + private boolean syncOption; + @Config(key = "rocksdb.writeoption.sync", + type = ConfigType.BOOLEAN, + defaultValue = "false", + tags = {ConfigTag.OM}, + description = "Enable/Disable Sync option. If true write will be " + + "considered complete, once flushed to persistent storage. If false," + + " writes are flushed asynchronously.") + public void setSyncOption(boolean enabled) { + this.syncOption = enabled; + } + + public boolean getSyncOption() { + return syncOption; + } + } 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 95f21ae..433b5c6 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 @@ -32,6 +32,7 @@ import org.apache.hadoop.hdds.client.BlockID; import org.apache.hadoop.hdds.conf.OzoneConfiguration; import org.apache.hadoop.hdds.utils.db.DBStore; import org.apache.hadoop.hdds.utils.db.DBStoreBuilder; +import org.apache.hadoop.hdds.utils.db.RocksDBConfiguration; import org.apache.hadoop.hdds.utils.db.Table; import org.apache.hadoop.hdds.utils.db.Table.KeyValue; import org.apache.hadoop.hdds.utils.db.TableIterator; @@ -244,9 +245,26 @@ public class OmMetadataManagerImpl implements OMMetadataManager { if (store == null) { File metaDir = OmUtils.getOmDbDir(configuration); - DBStoreBuilder dbStoreBuilder = DBStoreBuilder.newBuilder(configuration) - .setName(OM_DB_NAME) + RocksDBConfiguration rocksDBConfiguration = + configuration.getObject(RocksDBConfiguration.class); + + // As When ratis is not enabled, when we perform put/commit to rocksdb we + // should turn on sync flag. This needs to be done as when we return + // response to client it is considered as complete, but if we have + // power failure or machine crashes the recent writes will be lost. To + // avoid those kind of failures we need to enable sync. When Ratis is + // enabled, ratis log provides us this guaranty. This check is needed + // until HA code path becomes default in OM. + + // When ratis is not enabled override and set the sync. + if (!isRatisEnabled) { + rocksDBConfiguration.setSyncOption(true); + } + + DBStoreBuilder dbStoreBuilder = DBStoreBuilder.newBuilder(configuration, + rocksDBConfiguration).setName(OM_DB_NAME) .setPath(Paths.get(metaDir.getPath())); + this.store = addOMTablesAndCodecs(dbStoreBuilder).build(); initializeOmTables(); } diff --git a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java index e5cadff..58b057f 100644 --- a/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java +++ b/hadoop-ozone/ozone-manager/src/main/java/org/apache/hadoop/ozone/om/ratis/OzoneManagerDoubleBuffer.java @@ -144,6 +144,18 @@ public class OzoneManagerDoubleBuffer { }); omMetadataManager.getStore().commitBatchOperation(batchOperation); + + // Complete futures first and then do other things. So, that + // handler threads will be released. + if (!isRatisEnabled) { + // Once all entries are flushed, we can complete their future. + readyFutureQueue.iterator().forEachRemaining((entry) -> { + entry.complete(null); + }); + + readyFutureQueue.clear(); + } + int flushedTransactionsSize = readyBuffer.size(); flushedTransactionCount.addAndGet(flushedTransactionsSize); flushIterations.incrementAndGet(); @@ -173,14 +185,7 @@ public class OzoneManagerDoubleBuffer { // set metrics. updateMetrics(flushedTransactionsSize); - if (!isRatisEnabled) { - // Once all entries are flushed, we can complete their future. - readyFutureQueue.iterator().forEachRemaining((entry) -> { - entry.complete(null); - }); - readyFutureQueue.clear(); - } } } catch (InterruptedException ex) { Thread.currentThread().interrupt(); --------------------------------------------------------------------- To unsubscribe, e-mail: hdfs-commits-unsubscr...@hadoop.apache.org For additional commands, e-mail: hdfs-commits-h...@hadoop.apache.org