diff --git a/db/version_set.cc b/db/version_set.cc index 532e37361..c34fa385d 100644 --- a/db/version_set.cc +++ b/db/version_set.cc @@ -2413,6 +2413,7 @@ void VersionStorageInfo::PrepareForVersionAppend( GenerateLevelFilesBrief(); GenerateLevel0NonOverlapping(); GenerateBottommostFiles(); + GenerateFileLocationIndex(); } void Version::PrepareAppend(const MutableCFOptions& mutable_cf_options, @@ -3046,12 +3047,6 @@ void VersionStorageInfo::AddFile(int level, FileMetaData* f) { level_files.push_back(f); f->refs++; - - const uint64_t file_number = f->fd.GetNumber(); - - assert(file_locations_.find(file_number) == file_locations_.end()); - file_locations_.emplace(file_number, - FileLocation(level, level_files.size() - 1)); } void VersionStorageInfo::AddBlobFile( @@ -3286,6 +3281,28 @@ void VersionStorageInfo::GenerateBottommostFiles() { } } +void VersionStorageInfo::GenerateFileLocationIndex() { + size_t num_files = 0; + + for (int level = 0; level < num_levels_; ++level) { + num_files += files_[level].size(); + } + + file_locations_.reserve(num_files); + + for (int level = 0; level < num_levels_; ++level) { + for (size_t pos = 0; pos < files_[level].size(); ++pos) { + const FileMetaData* const meta = files_[level][pos]; + assert(meta); + + const uint64_t file_number = meta->fd.GetNumber(); + + assert(file_locations_.find(file_number) == file_locations_.end()); + file_locations_.emplace(file_number, FileLocation(level, pos)); + } + } +} + void VersionStorageInfo::UpdateOldestSnapshot(SequenceNumber seqnum) { assert(seqnum >= oldest_snapshot_seqnum_); oldest_snapshot_seqnum_ = seqnum; diff --git a/db/version_set.h b/db/version_set.h index 53f97012d..ce55e755d 100644 --- a/db/version_set.h +++ b/db/version_set.h @@ -302,7 +302,7 @@ class VersionStorageInfo { size_t position_ = 0; }; - // REQUIRES: This version has been saved (see VersionSet::SaveTo) + // REQUIRES: PrepareForVersionAppend has been called FileLocation GetFileLocation(uint64_t file_number) const { const auto it = file_locations_.find(file_number); @@ -319,7 +319,7 @@ class VersionStorageInfo { return it->second; } - // REQUIRES: This version has been saved (see VersionSet::SaveTo) + // REQUIRES: PrepareForVersionAppend has been called FileMetaData* GetFileMetaDataByNumber(uint64_t file_number) const { auto location = GetFileLocation(file_number); @@ -520,6 +520,7 @@ class VersionStorageInfo { void GenerateLevelFilesBrief(); void GenerateLevel0NonOverlapping(); void GenerateBottommostFiles(); + void GenerateFileLocationIndex(); const InternalKeyComparator* internal_comparator_; const Comparator* user_comparator_;