[代码问题]NebulaGraph代码中进行key前缀遍历时rocksdb迭代器使用问题

nebula代码中RocksEngine类中,封装了前缀查询和范围查询方法,每次Key前缀遍历时均新建一个rocksdb Iterator,std::unique_ptrrocksdb::Iterator iter(db_->NewIterator(options)); 代码片段如下。经过实测,在高并发prefix查询时,每次db_->NewIterator,相比将interator缓存劣化1到2倍,请问这块代码设计的背景是什么?是否可以将 db_->NewIterator优化成线程级别缓存,来提升查询性能?rocksdb本身提供了iter->Refresh() 方法,可以避免每次new 一个iterator,是否可以考虑做此优化?

nebula::cpp2::ErrorCode RocksEngine::prefixWithExtractor(const std::string& prefix,
const void* snapshot,
std::unique_ptr* storageIter) {
memory::MemoryCheckOffGuard guard;
storageIter->reset(new RocksPrefixIter(prefix));
rocksdb::ReadOptions options;
options.iterate_upper_bound = dynamic_cast<RocksPrefixIter*>(storageIter->get())->upperBound();
if (UNLIKELY(snapshot != nullptr)) {
options.snapshot = reinterpret_cast<const rocksdb::Snapshot*>(snapshot);
}
options.prefix_same_as_start = true;
std::unique_ptrrocksdb::Iterator iter(db_->NewIterator(options));
if (iter) {
iter->Seek(rocksdb::Slice(prefix));
dynamic_cast<RocksPrefixIter*>(storageIter->get())->reset(std::move(iter));
}
return nebula::cpp2::ErrorCode::SUCCEEDED;
}

1 个赞

不懂,可以提个 PR 或者 issue