#/**
# * Licensed to the Apache Software Foundation (ASF) under one
# * or more contributor license agreements.  See the NOTICE file
# * distributed with this work for additional information
# * regarding copyright ownership.  The ASF licenses this file
# * to you under the Apache License, Version 2.0 (the
# * "License"); you may not use this file except in compliance
# * with the License.  You may obtain a copy of the License at
# *
# *     http://www.apache.org/licenses/LICENSE-2.0
# *
# * Unless required by applicable law or agreed to in writing, software
# * distributed under the License is distributed on an "AS IS" BASIS,
# * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# * See the License for the specific language governing permissions and
# * limitations under the License.
# */

[DBOptions]
 # set by jni: options.setCreateIfMissing
 create_if_missing=true
 # set by jni: options.setInfoLogLevel
 info_log_level=INFO_LEVEL
 # set by jni: options.setKeepLogFileNum
 keep_log_file_num=30
 # set by jni: options.setLogFileTimeToRoll
 log_file_time_to_roll=86400
 # set by jni: options.setMaxBackgroundJobs or options.setIncreaseParallelism
 max_background_jobs=2
 # set by jni: options.setMaxSubcompactions
 max_subcompactions=1
 # set by jni: options.setMaxTotalWalSize
 max_total_wal_size=536870912
 # set by jni: options.setMaxOpenFiles
 max_open_files=-1
 # set by jni: options.setDeleteObsoleteFilesPeriodMicros
 delete_obsolete_files_period_micros=3600000000

[CFOptions "default"]
 # set by jni: options.setCompressionType
 compression=kLZ4Compression
 # set by jni: options.setWriteBufferSize
 write_buffer_size=67108864
 # set by jni: options.setMaxWriteBufferNumber
 max_write_buffer_number=4
 # set by jni: options.setNumLevels
 num_levels=7
 # set by jni: options.setLevelZeroFileNumCompactionTrigger
 level0_file_num_compaction_trigger=4
 # set by jni: options.setMaxBytesForLevelBase
 max_bytes_for_level_base=268435456
 # set by jni: options.setTargetFileSizeBase
 target_file_size_base=67108864

[TableOptions/BlockBasedTable "default"]
 # set by jni: tableOptions.setBlockSize
 block_size=65536
 # set by jni: tableOptions.setBlockCache
 block_cache=206150041
 # set by jni: tableOptions.setFormatVersion
 format_version=2
 # set by jni: tableOptions.setChecksumType
 checksum=kxxHash
 # set by jni: tableOptions.setFilterPolicy, bloomfilter:[bits_per_key]:[use_block_based_builder]
 filter_policy=rocksdb.BloomFilter:10:false
 # set by jni: tableOptions.setCacheIndexAndFilterBlocks
 cache_index_and_filter_blocks=true
 # set by jni: options.setLevelCompactionDynamicLevelBytes
 level_compaction_dynamic_level_bytes=true