Summary: This patch allows db_bench to initialize it's RocksDB Options via a options file, specified by the --options_file flag. Note that if --options_file flag is set, then it has higher priority than the command-line argument. Test Plan: db_bench_tool_test Reviewers: sdong, IslamAbdelRahman, kradhakrishnan, yiwu, andrewkr Reviewed By: andrewkr Subscribers: andrewkr, dhruba, leveldb Differential Revision: https://reviews.facebook.net/D58533main
parent
3a276b0cbe
commit
88acd932f6
@ -0,0 +1,323 @@ |
|||||||
|
// Copyright (c) 2011-present, Facebook, Inc. All rights reserved.
|
||||||
|
// This source code is licensed under the BSD-style license found in the
|
||||||
|
// LICENSE file in the root directory of this source tree. An additional grant
|
||||||
|
// of patent rights can be found in the PATENTS file in the same 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 "rocksdb/utilities/options_util.h" |
||||||
|
#include "util/options_parser.h" |
||||||
|
#include "util/random.h" |
||||||
|
#include "util/testharness.h" |
||||||
|
#include "util/testutil.h" |
||||||
|
|
||||||
|
#ifdef GFLAGS |
||||||
|
#include <gflags/gflags.h> |
||||||
|
|
||||||
|
namespace rocksdb { |
||||||
|
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::TmpDir() + "/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_, Env::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.base_background_compactions = 5; |
||||||
|
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.base_background_compactions = 5; |
||||||
|
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.base_background_compactions = 5; |
||||||
|
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 |
||||||
|
base_background_compactions=3 |
||||||
|
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 |
||||||
|
disable_data_sync=false |
||||||
|
recycle_log_file_num=0 |
||||||
|
disableDataSync=false |
||||||
|
create_missing_column_families=false |
||||||
|
log_file_time_to_roll=0 |
||||||
|
max_background_flushes=1 |
||||||
|
create_if_missing=true |
||||||
|
error_if_exists=false |
||||||
|
allow_os_buffer=true |
||||||
|
delayed_write_rate=1048576 |
||||||
|
manifest_preallocation_size=4194304 |
||||||
|
allow_mmap_writes=false |
||||||
|
stats_dump_period_sec=600 |
||||||
|
allow_fallocate=true |
||||||
|
allow_mmap_reads=false |
||||||
|
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_prefix_bloom_huge_page_tlb_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 |
||||||
|
verify_checksums_in_compaction=true |
||||||
|
merge_operator=nullptr |
||||||
|
memtable_prefix_bloom_bits=0 |
||||||
|
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"; |
||||||
|
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
|
||||||
|
|
||||||
|
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
|
Loading…
Reference in new issue