config max_background_flushes in db_bench

Summary: as title

Test Plan: make release

Reviewers: haobo, sdong, igor

Reviewed By: haobo

CC: leveldb

Differential Revision: https://reviews.facebook.net/D16437
main
Lei Jin 11 years ago
parent c0ccf43648
commit 51560ba755
  1. 40
      db/db_bench.cc

@ -189,6 +189,11 @@ DEFINE_int32(max_background_compactions,
"The maximum number of concurrent background compactions" "The maximum number of concurrent background compactions"
" that can occur in parallel."); " that can occur in parallel.");
DEFINE_int32(max_background_flushes,
rocksdb::Options().max_background_flushes,
"The maximum number of concurrent background flushes"
" that can occur in parallel.");
static rocksdb::CompactionStyle FLAGS_compaction_style_e; static rocksdb::CompactionStyle FLAGS_compaction_style_e;
DEFINE_int32(compaction_style, (int32_t) rocksdb::Options().compaction_style, DEFINE_int32(compaction_style, (int32_t) rocksdb::Options().compaction_style,
"style of compaction: level-based vs universal"); "style of compaction: level-based vs universal");
@ -225,6 +230,8 @@ DEFINE_int32(open_files, rocksdb::Options().max_open_files,
DEFINE_int32(bloom_bits, -1, "Bloom filter bits per key. Negative means" DEFINE_int32(bloom_bits, -1, "Bloom filter bits per key. Negative means"
" use default settings."); " use default settings.");
DEFINE_int32(memtable_bloom_bits, 0, "Bloom filter bits per key for memtable. "
"Negative means no bloom filter.");
DEFINE_bool(use_existing_db, false, "If true, do not destroy the existing" DEFINE_bool(use_existing_db, false, "If true, do not destroy the existing"
" database. If you set this flag and also specify a benchmark that" " database. If you set this flag and also specify a benchmark that"
@ -496,7 +503,8 @@ DEFINE_int64(keys_per_prefix, 0, "control average number of keys generated "
enum RepFactory { enum RepFactory {
kSkipList, kSkipList,
kPrefixHash, kPrefixHash,
kVectorRep kVectorRep,
kHashLinkedList
}; };
enum RepFactory StringToRepFactory(const char* ctype) { enum RepFactory StringToRepFactory(const char* ctype) {
assert(ctype); assert(ctype);
@ -507,12 +515,15 @@ enum RepFactory StringToRepFactory(const char* ctype) {
return kPrefixHash; return kPrefixHash;
else if (!strcasecmp(ctype, "vector")) else if (!strcasecmp(ctype, "vector"))
return kVectorRep; return kVectorRep;
else if (!strcasecmp(ctype, "hash_linkedlist"))
return kHashLinkedList;
fprintf(stdout, "Cannot parse memreptable %s\n", ctype); fprintf(stdout, "Cannot parse memreptable %s\n", ctype);
return kSkipList; return kSkipList;
} }
static enum RepFactory FLAGS_rep_factory; static enum RepFactory FLAGS_rep_factory;
DEFINE_string(memtablerep, "skip_list", ""); DEFINE_string(memtablerep, "skip_list", "");
DEFINE_int64(hash_bucket_count, 1024 * 1024, "hash bucket count");
DEFINE_bool(use_plain_table, false, "if use plain table " DEFINE_bool(use_plain_table, false, "if use plain table "
"instead of block-based table format"); "instead of block-based table format");
@ -876,6 +887,9 @@ class Benchmark {
case kVectorRep: case kVectorRep:
fprintf(stdout, "Memtablerep: vector\n"); fprintf(stdout, "Memtablerep: vector\n");
break; break;
case kHashLinkedList:
fprintf(stdout, "Memtablerep: hash_linkedlist\n");
break;
} }
fprintf(stdout, "Perf Level: %d\n", FLAGS_perf_level); fprintf(stdout, "Perf Level: %d\n", FLAGS_perf_level);
@ -1521,12 +1535,14 @@ class Benchmark {
options.min_write_buffer_number_to_merge = options.min_write_buffer_number_to_merge =
FLAGS_min_write_buffer_number_to_merge; FLAGS_min_write_buffer_number_to_merge;
options.max_background_compactions = FLAGS_max_background_compactions; options.max_background_compactions = FLAGS_max_background_compactions;
options.max_background_flushes = FLAGS_max_background_flushes;
options.compaction_style = FLAGS_compaction_style_e; options.compaction_style = FLAGS_compaction_style_e;
options.block_size = FLAGS_block_size; options.block_size = FLAGS_block_size;
options.filter_policy = filter_policy_; options.filter_policy = filter_policy_;
options.prefix_extractor = options.prefix_extractor =
(FLAGS_use_plain_table || FLAGS_use_prefix_blooms) ? prefix_extractor_ (FLAGS_use_plain_table || FLAGS_use_prefix_blooms) ? prefix_extractor_
: nullptr; : nullptr;
options.memtable_prefix_bloom_bits = FLAGS_memtable_bloom_bits;
options.max_open_files = FLAGS_open_files; options.max_open_files = FLAGS_open_files;
options.statistics = dbstats; options.statistics = dbstats;
options.env = FLAGS_env; options.env = FLAGS_env;
@ -1540,19 +1556,26 @@ class Benchmark {
options.max_bytes_for_level_multiplier = options.max_bytes_for_level_multiplier =
FLAGS_max_bytes_for_level_multiplier; FLAGS_max_bytes_for_level_multiplier;
options.filter_deletes = FLAGS_filter_deletes; options.filter_deletes = FLAGS_filter_deletes;
if ((FLAGS_prefix_size == 0) == (FLAGS_rep_factory == kPrefixHash)) { if ((FLAGS_prefix_size == 0) && (FLAGS_rep_factory == kPrefixHash ||
fprintf(stderr, "prefix_size should be non-zero iff memtablerep " FLAGS_rep_factory == kHashLinkedList)) {
"== prefix_hash\n"); fprintf(stderr, "prefix_size should be non-zero if PrefixHash or "
"HashLinkedList memtablerep is used\n");
exit(1); exit(1);
} }
switch (FLAGS_rep_factory) { switch (FLAGS_rep_factory) {
case kPrefixHash: case kPrefixHash:
options.memtable_factory.reset(NewHashSkipListRepFactory( options.memtable_factory.reset(NewHashSkipListRepFactory(
NewFixedPrefixTransform(FLAGS_prefix_size))); NewFixedPrefixTransform(FLAGS_prefix_size),
FLAGS_hash_bucket_count));
break; break;
case kSkipList: case kSkipList:
// no need to do anything // no need to do anything
break; break;
case kHashLinkedList:
options.memtable_factory.reset(NewHashLinkListRepFactory(
NewFixedPrefixTransform(FLAGS_prefix_size),
FLAGS_hash_bucket_count));
break;
case kVectorRep: case kVectorRep:
options.memtable_factory.reset( options.memtable_factory.reset(
new VectorRepFactory new VectorRepFactory
@ -1560,7 +1583,8 @@ class Benchmark {
break; break;
} }
if (FLAGS_use_plain_table) { if (FLAGS_use_plain_table) {
if (FLAGS_rep_factory != kPrefixHash) { if (FLAGS_rep_factory != kPrefixHash &&
FLAGS_rep_factory != kHashLinkedList) {
fprintf(stderr, "Waring: plain table is used with skipList\n"); fprintf(stderr, "Waring: plain table is used with skipList\n");
} }
if (!FLAGS_mmap_read && !FLAGS_mmap_write) { if (!FLAGS_mmap_read && !FLAGS_mmap_write) {
@ -1740,7 +1764,7 @@ class Benchmark {
void DoWrite(ThreadState* thread, WriteMode write_mode) { void DoWrite(ThreadState* thread, WriteMode write_mode) {
const int test_duration = write_mode == RANDOM ? FLAGS_duration : 0; const int test_duration = write_mode == RANDOM ? FLAGS_duration : 0;
const int num_ops = writes_ == 0 ? num_ : writes_ ; const int64_t num_ops = writes_ == 0 ? num_ : writes_;
Duration duration(test_duration, num_ops); Duration duration(test_duration, num_ops);
unique_ptr<BitSet> bit_set; unique_ptr<BitSet> bit_set;
@ -1923,6 +1947,8 @@ class Benchmark {
} }
delete iter; delete iter;
} else { // Regular case. Do one "get" at a time Get } else { // Regular case. Do one "get" at a time Get
options.tailing = true;
options.prefix_seek = (FLAGS_prefix_size == 0);
Iterator* iter = db_->NewIterator(options); Iterator* iter = db_->NewIterator(options);
std::string value; std::string value;
while (!duration.Done(1)) { while (!duration.Done(1)) {

Loading…
Cancel
Save