unfriend ForwardIterator from VersionSet

Summary: as title

Test Plan:
make release
will run full test on all stacked diffs

Reviewers: sdong, yhchiang, igor

Reviewed By: igor

Subscribers: dhruba, leveldb

Differential Revision: https://reviews.facebook.net/D27597
This commit is contained in:
Lei Jin 2014-10-28 10:08:41 -07:00
parent f981e08139
commit eb357af58c
4 changed files with 37 additions and 32 deletions

View File

@ -17,17 +17,17 @@ namespace rocksdb {
FileIndexer::FileIndexer(const Comparator* ucmp) FileIndexer::FileIndexer(const Comparator* ucmp)
: num_levels_(0), ucmp_(ucmp), level_rb_(nullptr) {} : num_levels_(0), ucmp_(ucmp), level_rb_(nullptr) {}
uint32_t FileIndexer::NumLevelIndex() { uint32_t FileIndexer::NumLevelIndex() const {
return next_level_index_.size(); return next_level_index_.size();
} }
uint32_t FileIndexer::LevelIndexSize(uint32_t level) { uint32_t FileIndexer::LevelIndexSize(uint32_t level) const {
return next_level_index_[level].num_index; return next_level_index_[level].num_index;
} }
void FileIndexer::GetNextLevelIndex( void FileIndexer::GetNextLevelIndex(
const uint32_t level, const uint32_t file_index, const int cmp_smallest, const uint32_t level, const uint32_t file_index, const int cmp_smallest,
const int cmp_largest, int32_t* left_bound, int32_t* right_bound) { const int cmp_largest, int32_t* left_bound, int32_t* right_bound) const {
assert(level > 0); assert(level > 0);
// Last level, no hint // Last level, no hint

View File

@ -42,9 +42,9 @@ class FileIndexer {
public: public:
explicit FileIndexer(const Comparator* ucmp); explicit FileIndexer(const Comparator* ucmp);
uint32_t NumLevelIndex(); uint32_t NumLevelIndex() const;
uint32_t LevelIndexSize(uint32_t level); uint32_t LevelIndexSize(uint32_t level) const;
// Return a file index range in the next level to search for a key based on // Return a file index range in the next level to search for a key based on
// smallest and largest key comparision for the current file specified by // smallest and largest key comparision for the current file specified by
@ -52,7 +52,7 @@ class FileIndexer {
// be valid and fit in the vector size. // be valid and fit in the vector size.
void GetNextLevelIndex( void GetNextLevelIndex(
const uint32_t level, const uint32_t file_index, const int cmp_smallest, const uint32_t level, const uint32_t file_index, const int cmp_smallest,
const int cmp_largest, int32_t* left_bound, int32_t* right_bound); const int cmp_largest, int32_t* left_bound, int32_t* right_bound) const;
void UpdateIndex(Arena* arena, const uint32_t num_levels, void UpdateIndex(Arena* arena, const uint32_t num_levels,
std::vector<FileMetaData*>* const files); std::vector<FileMetaData*>* const files);

View File

@ -219,15 +219,15 @@ void ForwardIterator::SeekInternal(const Slice& internal_key,
if (!seek_to_first) { if (!seek_to_first) {
user_key = ExtractUserKey(internal_key); user_key = ExtractUserKey(internal_key);
} }
auto* files = sv_->current->files_; const std::vector<FileMetaData*>& l0 = sv_->current->LevelFiles(0);
for (uint32_t i = 0; i < files[0].size(); ++i) { for (uint32_t i = 0; i < l0.size(); ++i) {
if (seek_to_first) { if (seek_to_first) {
l0_iters_[i]->SeekToFirst(); l0_iters_[i]->SeekToFirst();
} else { } else {
// If the target key passes over the larget key, we are sure Next() // If the target key passes over the larget key, we are sure Next()
// won't go over this file. // won't go over this file.
if (user_comparator_->Compare(user_key, if (user_comparator_->Compare(user_key,
files[0][i]->largest.user_key()) > 0) { l0[i]->largest.user_key()) > 0) {
continue; continue;
} }
l0_iters_[i]->Seek(internal_key); l0_iters_[i]->Seek(internal_key);
@ -248,64 +248,63 @@ void ForwardIterator::SeekInternal(const Slice& internal_key,
int32_t search_left_bound = 0; int32_t search_left_bound = 0;
int32_t search_right_bound = FileIndexer::kLevelMaxIndex; int32_t search_right_bound = FileIndexer::kLevelMaxIndex;
for (int32_t level = 1; level < sv_->current->NumberLevels(); ++level) { for (int32_t level = 1; level < sv_->current->NumberLevels(); ++level) {
if (files[level].empty()) { const std::vector<FileMetaData*>& level_files =
sv_->current->LevelFiles(level);
if (level_files.empty()) {
search_left_bound = 0; search_left_bound = 0;
search_right_bound = FileIndexer::kLevelMaxIndex; search_right_bound = FileIndexer::kLevelMaxIndex;
continue; continue;
} }
assert(level_iters_[level - 1] != nullptr); assert(level_iters_[level - 1] != nullptr);
uint32_t f_idx = 0; uint32_t f_idx = 0;
const auto& indexer = sv_->current->GetIndexer();
if (!seek_to_first) { if (!seek_to_first) {
// TODO(ljin): remove before committing
// f_idx = FindFileInRange(
// files[level], internal_key, 0, files[level].size());
if (search_left_bound == search_right_bound) { if (search_left_bound == search_right_bound) {
f_idx = search_left_bound; f_idx = search_left_bound;
} else if (search_left_bound < search_right_bound) { } else if (search_left_bound < search_right_bound) {
f_idx = FindFileInRange( f_idx = FindFileInRange(
files[level], internal_key, search_left_bound, level_files, internal_key, search_left_bound,
search_right_bound == FileIndexer::kLevelMaxIndex ? search_right_bound == FileIndexer::kLevelMaxIndex ?
files[level].size() : search_right_bound); level_files.size() : search_right_bound);
} else { } else {
// search_left_bound > search_right_bound // search_left_bound > search_right_bound
// There are only 2 cases this can happen: // There are only 2 cases this can happen:
// (1) target key is smaller than left most file // (1) target key is smaller than left most file
// (2) target key is larger than right most file // (2) target key is larger than right most file
assert(search_left_bound == (int32_t)files[level].size() || assert(search_left_bound == (int32_t)level_files.size() ||
search_right_bound == -1); search_right_bound == -1);
if (search_right_bound == -1) { if (search_right_bound == -1) {
assert(search_left_bound == 0); assert(search_left_bound == 0);
f_idx = 0; f_idx = 0;
} else { } else {
sv_->current->file_indexer_.GetNextLevelIndex( indexer.GetNextLevelIndex(
level, files[level].size() - 1, level, level_files.size() - 1,
1, 1, &search_left_bound, &search_right_bound); 1, 1, &search_left_bound, &search_right_bound);
continue; continue;
} }
} }
// Prepare hints for the next level // Prepare hints for the next level
if (f_idx < files[level].size()) { if (f_idx < level_files.size()) {
int cmp_smallest = user_comparator_->Compare( int cmp_smallest = user_comparator_->Compare(
user_key, files[level][f_idx]->smallest.user_key()); user_key, level_files[f_idx]->smallest.user_key());
int cmp_largest = -1; int cmp_largest = -1;
if (cmp_smallest >= 0) { if (cmp_smallest >= 0) {
cmp_smallest = user_comparator_->Compare( cmp_smallest = user_comparator_->Compare(
user_key, files[level][f_idx]->smallest.user_key()); user_key, level_files[f_idx]->smallest.user_key());
} }
sv_->current->file_indexer_.GetNextLevelIndex(level, f_idx, indexer.GetNextLevelIndex(level, f_idx,
cmp_smallest, cmp_largest, cmp_smallest, cmp_largest,
&search_left_bound, &search_right_bound); &search_left_bound, &search_right_bound);
} else { } else {
sv_->current->file_indexer_.GetNextLevelIndex( indexer.GetNextLevelIndex(
level, files[level].size() - 1, level, level_files.size() - 1,
1, 1, &search_left_bound, &search_right_bound); 1, 1, &search_left_bound, &search_right_bound);
} }
} }
// Seek // Seek
if (f_idx < files[level].size()) { if (f_idx < level_files.size()) {
level_iters_[level - 1]->SetFileIndex(f_idx); level_iters_[level - 1]->SetFileIndex(f_idx);
seek_to_first ? level_iters_[level - 1]->SeekToFirst() : seek_to_first ? level_iters_[level - 1]->SeekToFirst() :
level_iters_[level - 1]->Seek(internal_key); level_iters_[level - 1]->Seek(internal_key);
@ -428,7 +427,7 @@ void ForwardIterator::RebuildIterators(bool refresh_sv) {
} }
mutable_iter_ = sv_->mem->NewIterator(read_options_, &arena_); mutable_iter_ = sv_->mem->NewIterator(read_options_, &arena_);
sv_->imm->AddIterators(read_options_, &imm_iters_, &arena_); sv_->imm->AddIterators(read_options_, &imm_iters_, &arena_);
const auto& l0_files = sv_->current->files_[0]; const auto& l0_files = sv_->current->LevelFiles(0);
l0_iters_.reserve(l0_files.size()); l0_iters_.reserve(l0_files.size());
for (const auto* l0 : l0_files) { for (const auto* l0 : l0_files) {
l0_iters_.push_back(cfd_->table_cache()->NewIterator( l0_iters_.push_back(cfd_->table_cache()->NewIterator(
@ -436,11 +435,12 @@ void ForwardIterator::RebuildIterators(bool refresh_sv) {
} }
level_iters_.reserve(sv_->current->NumberLevels() - 1); level_iters_.reserve(sv_->current->NumberLevels() - 1);
for (int32_t level = 1; level < sv_->current->NumberLevels(); ++level) { for (int32_t level = 1; level < sv_->current->NumberLevels(); ++level) {
if (sv_->current->files_[level].empty()) { const auto& level_files = sv_->current->LevelFiles(level);
if (level_files.empty()) {
level_iters_.push_back(nullptr); level_iters_.push_back(nullptr);
} else { } else {
level_iters_.push_back(new LevelIterator(cfd_, read_options_, level_iters_.push_back(
sv_->current->files_[level])); new LevelIterator(cfd_, read_options_, level_files));
} }
} }
@ -449,7 +449,7 @@ void ForwardIterator::RebuildIterators(bool refresh_sv) {
} }
void ForwardIterator::ResetIncompleteIterators() { void ForwardIterator::ResetIncompleteIterators() {
const auto& l0_files = sv_->current->files_[0]; const auto& l0_files = sv_->current->LevelFiles(0);
for (uint32_t i = 0; i < l0_iters_.size(); ++i) { for (uint32_t i = 0; i < l0_iters_.size(); ++i) {
assert(i < l0_files.size()); assert(i < l0_files.size());
if (!l0_iters_[i]->status().IsIncomplete()) { if (!l0_iters_[i]->status().IsIncomplete()) {

View File

@ -297,10 +297,15 @@ class Version {
return next_; return next_;
} }
// REQUIRES: This version has been saved (see VersionSet::SaveTo)
const FileIndexer& GetIndexer() const {
assert(finalized_);
return file_indexer_;
}
private: private:
friend class VersionSet; friend class VersionSet;
friend class DBImpl; friend class DBImpl;
friend class ForwardIterator;
friend class InternalStats; friend class InternalStats;
class LevelFileNumIterator; class LevelFileNumIterator;