| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320 |
- // Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
- // This source code is licensed under both the GPLv2 (found in the
- // COPYING file in the root directory) and Apache 2.0 License
- // (found in the LICENSE.Apache file in the root directory).
- //
- // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file. See the AUTHORS file for names of contributors.
- #include "rocksdb/db_bench_tool.h"
- #include "options/options_parser.h"
- #include "rocksdb/utilities/options_util.h"
- #include "test_util/testharness.h"
- #include "test_util/testutil.h"
- #include "util/random.h"
- #ifdef GFLAGS
- #include "util/gflags_compat.h"
- namespace ROCKSDB_NAMESPACE {
- namespace {
- static const int kMaxArgCount = 100;
- static const size_t kArgBufferSize = 100000;
- } // namespace
- class DBBenchTest : public testing::Test {
- public:
- DBBenchTest() : rnd_(0xFB) {
- test_path_ = test::PerThreadDBPath("db_bench_test");
- Env::Default()->CreateDir(test_path_);
- db_path_ = test_path_ + "/db";
- wal_path_ = test_path_ + "/wal";
- }
- ~DBBenchTest() {
- // DestroyDB(db_path_, Options());
- }
- void ResetArgs() {
- argc_ = 0;
- cursor_ = 0;
- memset(arg_buffer_, 0, kArgBufferSize);
- }
- void AppendArgs(const std::vector<std::string>& args) {
- for (const auto& arg : args) {
- ASSERT_LE(cursor_ + arg.size() + 1, kArgBufferSize);
- ASSERT_LE(argc_ + 1, kMaxArgCount);
- snprintf(arg_buffer_ + cursor_, arg.size() + 1, "%s", arg.c_str());
- argv_[argc_++] = arg_buffer_ + cursor_;
- cursor_ += arg.size() + 1;
- }
- }
- void RunDbBench(const std::string& options_file_name) {
- AppendArgs({"./db_bench", "--benchmarks=fillseq", "--use_existing_db=0",
- "--num=1000",
- std::string(std::string("--db=") + db_path_).c_str(),
- std::string(std::string("--wal_dir=") + wal_path_).c_str(),
- std::string(std::string("--options_file=") + options_file_name)
- .c_str()});
- ASSERT_EQ(0, db_bench_tool(argc(), argv()));
- }
- void VerifyOptions(const Options& opt) {
- DBOptions loaded_db_opts;
- std::vector<ColumnFamilyDescriptor> cf_descs;
- ASSERT_OK(LoadLatestOptions(db_path_, FileSystem::Default(),
- &loaded_db_opts, &cf_descs));
- ASSERT_OK(
- RocksDBOptionsParser::VerifyDBOptions(DBOptions(opt), loaded_db_opts));
- ASSERT_OK(RocksDBOptionsParser::VerifyCFOptions(ColumnFamilyOptions(opt),
- cf_descs[0].options));
- // check with the default rocksdb options and expect failure
- ASSERT_NOK(
- RocksDBOptionsParser::VerifyDBOptions(DBOptions(), loaded_db_opts));
- ASSERT_NOK(RocksDBOptionsParser::VerifyCFOptions(ColumnFamilyOptions(),
- cf_descs[0].options));
- }
- char** argv() { return argv_; }
- int argc() { return argc_; }
- std::string db_path_;
- std::string test_path_;
- std::string wal_path_;
- char arg_buffer_[kArgBufferSize];
- char* argv_[kMaxArgCount];
- int argc_ = 0;
- int cursor_ = 0;
- Random rnd_;
- };
- namespace {} // namespace
- TEST_F(DBBenchTest, OptionsFile) {
- const std::string kOptionsFileName = test_path_ + "/OPTIONS_test";
- Options opt;
- opt.create_if_missing = true;
- opt.max_open_files = 256;
- opt.max_background_compactions = 10;
- opt.arena_block_size = 8388608;
- ASSERT_OK(PersistRocksDBOptions(DBOptions(opt), {"default"},
- {ColumnFamilyOptions(opt)}, kOptionsFileName,
- Env::Default()));
- // override the following options as db_bench will not take these
- // options from the options file
- opt.wal_dir = wal_path_;
- RunDbBench(kOptionsFileName);
- VerifyOptions(opt);
- }
- TEST_F(DBBenchTest, OptionsFileUniversal) {
- const std::string kOptionsFileName = test_path_ + "/OPTIONS_test";
- Options opt;
- opt.compaction_style = kCompactionStyleUniversal;
- opt.num_levels = 1;
- opt.create_if_missing = true;
- opt.max_open_files = 256;
- opt.max_background_compactions = 10;
- opt.arena_block_size = 8388608;
- ASSERT_OK(PersistRocksDBOptions(DBOptions(opt), {"default"},
- {ColumnFamilyOptions(opt)}, kOptionsFileName,
- Env::Default()));
- // override the following options as db_bench will not take these
- // options from the options file
- opt.wal_dir = wal_path_;
- RunDbBench(kOptionsFileName);
- VerifyOptions(opt);
- }
- TEST_F(DBBenchTest, OptionsFileMultiLevelUniversal) {
- const std::string kOptionsFileName = test_path_ + "/OPTIONS_test";
- Options opt;
- opt.compaction_style = kCompactionStyleUniversal;
- opt.num_levels = 12;
- opt.create_if_missing = true;
- opt.max_open_files = 256;
- opt.max_background_compactions = 10;
- opt.arena_block_size = 8388608;
- ASSERT_OK(PersistRocksDBOptions(DBOptions(opt), {"default"},
- {ColumnFamilyOptions(opt)}, kOptionsFileName,
- Env::Default()));
- // override the following options as db_bench will not take these
- // options from the options file
- opt.wal_dir = wal_path_;
- RunDbBench(kOptionsFileName);
- VerifyOptions(opt);
- }
- const std::string options_file_content = R"OPTIONS_FILE(
- [Version]
- rocksdb_version=4.3.1
- options_file_version=1.1
- [DBOptions]
- wal_bytes_per_sync=1048576
- delete_obsolete_files_period_micros=0
- WAL_ttl_seconds=0
- WAL_size_limit_MB=0
- db_write_buffer_size=0
- max_subcompactions=1
- table_cache_numshardbits=4
- max_open_files=-1
- max_file_opening_threads=10
- max_background_compactions=5
- use_fsync=false
- use_adaptive_mutex=false
- max_total_wal_size=18446744073709551615
- compaction_readahead_size=0
- new_table_reader_for_compaction_inputs=false
- keep_log_file_num=10
- skip_stats_update_on_db_open=false
- max_manifest_file_size=18446744073709551615
- db_log_dir=
- skip_log_error_on_recovery=false
- writable_file_max_buffer_size=1048576
- paranoid_checks=true
- is_fd_close_on_exec=true
- bytes_per_sync=1048576
- enable_thread_tracking=true
- recycle_log_file_num=0
- create_missing_column_families=false
- log_file_time_to_roll=0
- max_background_flushes=1
- create_if_missing=true
- error_if_exists=false
- delayed_write_rate=1048576
- manifest_preallocation_size=4194304
- allow_mmap_reads=false
- allow_mmap_writes=false
- use_direct_reads=false
- use_direct_io_for_flush_and_compaction=false
- stats_dump_period_sec=600
- allow_fallocate=true
- max_log_file_size=83886080
- random_access_max_buffer_size=1048576
- advise_random_on_open=true
- [CFOptions "default"]
- compaction_filter_factory=nullptr
- table_factory=BlockBasedTable
- prefix_extractor=nullptr
- comparator=leveldb.BytewiseComparator
- compression_per_level=
- max_bytes_for_level_base=104857600
- bloom_locality=0
- target_file_size_base=10485760
- memtable_huge_page_size=0
- max_successive_merges=1000
- max_sequential_skip_in_iterations=8
- arena_block_size=52428800
- target_file_size_multiplier=1
- source_compaction_factor=1
- min_write_buffer_number_to_merge=1
- max_write_buffer_number=2
- write_buffer_size=419430400
- max_grandparent_overlap_factor=10
- max_bytes_for_level_multiplier=10
- memtable_factory=SkipListFactory
- compression=kSnappyCompression
- min_partial_merge_operands=2
- level0_stop_writes_trigger=100
- num_levels=1
- level0_slowdown_writes_trigger=50
- level0_file_num_compaction_trigger=10
- expanded_compaction_factor=25
- soft_rate_limit=0.000000
- max_write_buffer_number_to_maintain=0
- max_write_buffer_size_to_maintain=0
- verify_checksums_in_compaction=true
- merge_operator=nullptr
- memtable_prefix_bloom_bits=0
- memtable_whole_key_filtering=true
- paranoid_file_checks=false
- inplace_update_num_locks=10000
- optimize_filters_for_hits=false
- level_compaction_dynamic_level_bytes=false
- inplace_update_support=false
- compaction_style=kCompactionStyleUniversal
- memtable_prefix_bloom_probes=6
- purge_redundant_kvs_while_flush=true
- filter_deletes=false
- hard_pending_compaction_bytes_limit=0
- disable_auto_compactions=false
- compaction_measure_io_stats=false
- [TableOptions/BlockBasedTable "default"]
- format_version=0
- skip_table_builder_flush=false
- cache_index_and_filter_blocks=false
- flush_block_policy_factory=FlushBlockBySizePolicyFactory
- hash_index_allow_collision=true
- index_type=kBinarySearch
- whole_key_filtering=true
- checksum=kCRC32c
- no_block_cache=false
- block_size=32768
- block_size_deviation=10
- block_restart_interval=16
- filter_policy=rocksdb.BuiltinBloomFilter
- )OPTIONS_FILE";
- TEST_F(DBBenchTest, OptionsFileFromFile) {
- const std::string kOptionsFileName = test_path_ + "/OPTIONS_flash";
- std::unique_ptr<WritableFile> writable;
- ASSERT_OK(Env::Default()->NewWritableFile(kOptionsFileName, &writable,
- EnvOptions()));
- ASSERT_OK(writable->Append(options_file_content));
- ASSERT_OK(writable->Close());
- DBOptions db_opt;
- std::vector<ColumnFamilyDescriptor> cf_descs;
- ASSERT_OK(LoadOptionsFromFile(kOptionsFileName, Env::Default(), &db_opt,
- &cf_descs));
- Options opt(db_opt, cf_descs[0].options);
- opt.create_if_missing = true;
- // override the following options as db_bench will not take these
- // options from the options file
- opt.wal_dir = wal_path_;
- RunDbBench(kOptionsFileName);
- VerifyOptions(opt);
- }
- } // namespace ROCKSDB_NAMESPACE
- int main(int argc, char** argv) {
- ::testing::InitGoogleTest(&argc, argv);
- google::ParseCommandLineFlags(&argc, &argv, true);
- return RUN_ALL_TESTS();
- }
- #else
- int main(int argc, char** argv) {
- printf("Skip db_bench_tool_test as the required library GFLAG is missing.");
- }
- #endif // #ifdef GFLAGS
|