zymap commented on code in PR #3523: URL: https://github.com/apache/bookkeeper/pull/3523#discussion_r996798009
########## bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/KeyValueStorageRocksDB.java: ########## @@ -20,27 +20,44 @@ */ package org.apache.bookkeeper.bookie.storage.ldb; + import static com.google.common.base.Preconditions.checkState; +//CHECKSTYLE.OFF: IllegalImport Review Comment: The checkstyle doesn't allow we use this imports `io.netty.util.internal.PlatformDependent.maxDirectMemory`. We disabled it before https://github.com/apache/bookkeeper/pull/3056/files#diff-cbb728e9ff8fae16673eb48455d2eebc18d12ed8fec6a93266bb9363527dad97L25 ########## bookkeeper-server/src/main/java/org/apache/bookkeeper/bookie/storage/ldb/KeyValueStorageRocksDB.java: ########## @@ -109,26 +158,129 @@ public KeyValueStorageRocksDB(String basePath, String subPath, DbConfigType dbCo dbOptions.setDbLogDir(logPathSetting.toString()); } String path = FileSystems.getDefault().getPath(basePath, subPath).toFile().toString(); - + this.options = dbOptions; + this.columnFamilyDescriptors = cfDescs; if (readOnly) { - db = RocksDB.openReadOnly(dbOptions, path, cfDescs, cfHandles); + return RocksDB.openReadOnly(dbOptions, path, cfDescs, cfHandles); } else { - db = RocksDB.open(dbOptions, path, cfDescs, cfHandles); + return RocksDB.open(dbOptions, path, cfDescs, cfHandles); } } catch (RocksDBException e) { throw new IOException("Error open RocksDB database", e); } + } - optionSync.setSync(true); - optionDontSync.setSync(false); + private RocksDB initializeRocksDBWithBookieConf(String basePath, String subPath, DbConfigType dbConfigType, + ServerConfiguration conf, boolean readOnly) throws IOException { + Options options = new Options(); + options.setCreateIfMissing(true); + + if (dbConfigType == DbConfigType.EntryLocation) { + /* Set default RocksDB block-cache size to 10% / numberOfLedgers of direct memory, unless override */ + int ledgerDirsSize = conf.getLedgerDirNames().length; + long defaultRocksDBBlockCacheSizeBytes = maxDirectMemory() / ledgerDirsSize / 10; + long blockCacheSize = DbLedgerStorage.getLongVariableOrDefault(conf, ROCKSDB_BLOCK_CACHE_SIZE, + defaultRocksDBBlockCacheSizeBytes); + + long writeBufferSizeMB = conf.getInt(ROCKSDB_WRITE_BUFFER_SIZE_MB, 64); + long sstSizeMB = conf.getInt(ROCKSDB_SST_SIZE_MB, 64); + int numLevels = conf.getInt(ROCKSDB_NUM_LEVELS, -1); + int numFilesInLevel0 = conf.getInt(ROCKSDB_NUM_FILES_IN_LEVEL0, 4); + long maxSizeInLevel1MB = conf.getLong(ROCKSDB_MAX_SIZE_IN_LEVEL1_MB, 256); + int blockSize = conf.getInt(ROCKSDB_BLOCK_SIZE, 64 * 1024); + int bloomFilterBitsPerKey = conf.getInt(ROCKSDB_BLOOM_FILTERS_BITS_PER_KEY, 10); + boolean lz4CompressionEnabled = conf.getBoolean(ROCKSDB_LZ4_COMPRESSION_ENABLED, true); + int formatVersion = conf.getInt(ROCKSDB_FORMAT_VERSION, 2); + + if (lz4CompressionEnabled) { + options.setCompressionType(CompressionType.LZ4_COMPRESSION); + } + options.setWriteBufferSize(writeBufferSizeMB * 1024 * 1024); + options.setMaxWriteBufferNumber(4); + if (numLevels > 0) { + options.setNumLevels(numLevels); + } + options.setLevelZeroFileNumCompactionTrigger(numFilesInLevel0); + options.setMaxBytesForLevelBase(maxSizeInLevel1MB * 1024 * 1024); + options.setMaxBackgroundJobs(32); + options.setIncreaseParallelism(32); + options.setMaxTotalWalSize(512 * 1024 * 1024); + options.setMaxOpenFiles(-1); + options.setTargetFileSizeBase(sstSizeMB * 1024 * 1024); + options.setDeleteObsoleteFilesPeriodMicros(TimeUnit.HOURS.toMicros(1)); + + this.cache = new LRUCache(blockCacheSize); + BlockBasedTableConfig tableOptions = new BlockBasedTableConfig(); + tableOptions.setBlockSize(blockSize); + tableOptions.setBlockCache(cache); + tableOptions.setFormatVersion(formatVersion); + tableOptions.setChecksumType(ChecksumType.kxxHash); + if (bloomFilterBitsPerKey > 0) { + tableOptions.setFilterPolicy(new BloomFilter(bloomFilterBitsPerKey, false)); + } - optionCache.setFillCache(true); - optionDontCache.setFillCache(false); + // Options best suited for HDDs + tableOptions.setCacheIndexAndFilterBlocks(true); + options.setLevelCompactionDynamicLevelBytes(true); + + options.setTableFormatConfig(tableOptions); + } else { + this.cache = null; + } + + // Configure file path + String logPath = conf.getString(ROCKSDB_LOG_PATH, ""); + if (!logPath.isEmpty()) { + Path logPathSetting = FileSystems.getDefault().getPath(logPath, subPath); + Files.createDirectories(logPathSetting); + log.info("RocksDB<{}> log path: {}", subPath, logPathSetting); + options.setDbLogDir(logPathSetting.toString()); + } + String path = FileSystems.getDefault().getPath(basePath, subPath).toFile().toString(); + + // Configure log level + String logLevel = conf.getString(ROCKSDB_LOG_LEVEL, "info"); + switch (logLevel) { + case "debug": + options.setInfoLogLevel(InfoLogLevel.DEBUG_LEVEL); + break; + case "info": + options.setInfoLogLevel(InfoLogLevel.INFO_LEVEL); + break; + case "warn": + options.setInfoLogLevel(InfoLogLevel.WARN_LEVEL); + break; + case "error": + options.setInfoLogLevel(InfoLogLevel.ERROR_LEVEL); + break; + default: + log.warn("Unrecognized RockDB log level: {}", logLevel); + } + + // Keep log files for 1month + options.setKeepLogFileNum(30); + options.setLogFileTimeToRoll(TimeUnit.DAYS.toSeconds(1)); + this.options = options; + try { + if (readOnly) { + return RocksDB.openReadOnly(options, path); + } else { + return RocksDB.open(options, path); + } + } catch (RocksDBException e) { + throw new IOException("Error open RocksDB database", e); + } } @Override public void close() throws IOException { db.close(); + if (cache != null) { + cache.close(); + } + if (options != null) { Review Comment: It's just for testing. -- This is an automated message from the Apache Git Service. To respond to the message, please log on to GitHub and use the URL above to go to the specific comment. To unsubscribe, e-mail: [email protected] For queries about this service, please contact Infrastructure at: [email protected]
