diff --git a/db/db_bench.cc b/db/db_bench.cc index dbd8cecd9fdc5ddc7a8d4d2564577b8bb8e52949..44b684e099d6a6c8a83772002966593ef8162e6f 100644 --- a/db/db_bench.cc +++ b/db/db_bench.cc @@ -465,6 +465,8 @@ static auto FLAGS_compaction_fadvice_e = DEFINE_bool(use_tailing_iterator, false, "Use tailing iterator to access a series of keys instead of get"); +DEFINE_int64(iter_refresh_interval_us, -1, + "How often to refresh iterators. Disable refresh when -1"); DEFINE_bool(use_adaptive_mutex, rocksdb::Options().use_adaptive_mutex, "Use adaptive mutex"); @@ -2009,12 +2011,31 @@ class Benchmark { multi_iters.push_back(db->NewIterator(options)); } } + uint64_t last_refresh = FLAGS_env->NowMicros(); Slice key = AllocateKey(); std::unique_ptr key_guard(key.data()); Duration duration(FLAGS_duration, reads_); while (!duration.Done(1)) { + if (!FLAGS_use_tailing_iterator && FLAGS_iter_refresh_interval_us >= 0) { + uint64_t now = FLAGS_env->NowMicros(); + if (now - last_refresh > (uint64_t)FLAGS_iter_refresh_interval_us) { + if (db_ != nullptr) { + delete single_iter; + single_iter = db_->NewIterator(options); + } else { + for (auto iter : multi_iters) { + delete iter; + } + multi_iters.clear(); + for (DB* db : multi_dbs_) { + multi_iters.push_back(db->NewIterator(options)); + } + } + } + last_refresh = now; + } // Pick a Iterator to use Iterator* iter_to_use = single_iter; if (single_iter == nullptr) {