summaryrefslogtreecommitdiff
path: root/db/version_set.cc
diff options
context:
space:
mode:
Diffstat (limited to 'db/version_set.cc')
-rw-r--r--db/version_set.cc129
1 files changed, 18 insertions, 111 deletions
diff --git a/db/version_set.cc b/db/version_set.cc
index 31f79bb..c439f49 100644
--- a/db/version_set.cc
+++ b/db/version_set.cc
@@ -58,7 +58,7 @@ std::string IntSetToString(const std::set<uint64_t>& s) {
Version::~Version() {
assert(refs_ == 0);
for (int level = 0; level < config::kNumLevels; level++) {
- for (int i = 0; i < files_[level].size(); i++) {
+ for (size_t i = 0; i < files_[level].size(); i++) {
FileMetaData* f = files_[level][i];
assert(f->refs >= 0);
f->refs--;
@@ -134,7 +134,7 @@ class Version::LevelFileNumIterator : public Iterator {
private:
const InternalKeyComparator icmp_;
const std::vector<FileMetaData*>* const flist_;
- int index_;
+ uint32_t index_;
// Backing store for value(). Holds the file number and size.
mutable char value_buf_[16];
@@ -164,7 +164,7 @@ Iterator* Version::NewConcatenatingIterator(const ReadOptions& options,
void Version::AddIterators(const ReadOptions& options,
std::vector<Iterator*>* iters) {
// Merge all level zero files together since they may overlap
- for (int i = 0; i < files_[0].size(); i++) {
+ for (size_t i = 0; i < files_[0].size(); i++) {
iters->push_back(
vset_->table_cache_->NewIterator(
options, files_[0][i]->number, files_[0][i]->file_size));
@@ -201,7 +201,7 @@ std::string Version::DebugString() const {
AppendNumberTo(&r, level);
r.push_back(':');
const std::vector<FileMetaData*>& files = files_[level];
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
r.push_back(' ');
AppendNumberTo(&r, files[i]->number);
r.push_back(':');
@@ -232,7 +232,7 @@ class VersionSet::Builder {
: vset_(vset) {
for (int level = 0; level < config::kNumLevels; level++) {
const std::vector<FileMetaData*>& files = base->files_[level];
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
FileMetaData* f = files[i];
f->refs++;
files_[level].insert(std::make_pair(f->number, f));
@@ -258,7 +258,7 @@ class VersionSet::Builder {
// Apply all of the edits in *edit to the current state.
void Apply(VersionEdit* edit) {
// Update compaction pointers
- for (int i = 0; i < edit->compact_pointers_.size(); i++) {
+ for (size_t i = 0; i < edit->compact_pointers_.size(); i++) {
const int level = edit->compact_pointers_[i].first;
vset_->compact_pointer_[level] =
edit->compact_pointers_[i].second.Encode().ToString();
@@ -284,19 +284,13 @@ class VersionSet::Builder {
}
// Add new files
- for (int i = 0; i < edit->new_files_.size(); i++) {
+ for (size_t i = 0; i < edit->new_files_.size(); i++) {
const int level = edit->new_files_[i].first;
FileMetaData* f = new FileMetaData(edit->new_files_[i].second);
f->refs = 1;
assert(files_[level].count(f->number) == 0);
files_[level].insert(std::make_pair(f->number, f));
}
-
- // Add large value refs
- for (int i = 0; i < edit->large_refs_added_.size(); i++) {
- const VersionEdit::Large& l = edit->large_refs_added_[i];
- vset_->RegisterLargeValueRef(l.large_ref, l.fnum, l.internal_key);
- }
}
// Save the current state in *v.
@@ -545,7 +539,7 @@ Status VersionSet::Recover() {
static int64_t TotalFileSize(const std::vector<FileMetaData*>& files) {
int64_t sum = 0;
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
sum += files[i]->file_size;
}
return sum;
@@ -610,25 +604,12 @@ Status VersionSet::WriteSnapshot(log::Writer* log) {
// Save files
for (int level = 0; level < config::kNumLevels; level++) {
const std::vector<FileMetaData*>& files = current_->files_[level];
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
const FileMetaData* f = files[i];
edit.AddFile(level, f->number, f->file_size, f->smallest, f->largest);
}
}
- // Save large value refs
- for (LargeValueMap::const_iterator it = large_value_refs_.begin();
- it != large_value_refs_.end();
- ++it) {
- const LargeValueRef& ref = it->first;
- const LargeReferencesSet& pointers = it->second;
- for (LargeReferencesSet::const_iterator j = pointers.begin();
- j != pointers.end();
- ++j) {
- edit.AddLargeValueRef(ref, j->first, j->second);
- }
- }
-
std::string record;
edit.EncodeTo(&record);
return log->AddRecord(record);
@@ -651,7 +632,7 @@ Status VersionSet::SortLevel(Version* v, uint64_t level) {
if (result.ok() && level > 0) {
// There should be no overlap
- for (int i = 1; i < v->files_[level].size(); i++) {
+ for (size_t i = 1; i < v->files_[level].size(); i++) {
const InternalKey& prev_end = v->files_[level][i-1]->largest;
const InternalKey& this_begin = v->files_[level][i]->smallest;
if (icmp_.Compare(prev_end, this_begin) >= 0) {
@@ -676,7 +657,7 @@ uint64_t VersionSet::ApproximateOffsetOf(Version* v, const InternalKey& ikey) {
uint64_t result = 0;
for (int level = 0; level < config::kNumLevels; level++) {
const std::vector<FileMetaData*>& files = v->files_[level];
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
if (icmp_.Compare(files[i]->largest, ikey) <= 0) {
// Entire file is before "ikey", so just add the file size
result += files[i]->file_size;
@@ -701,83 +682,9 @@ uint64_t VersionSet::ApproximateOffsetOf(Version* v, const InternalKey& ikey) {
}
}
}
-
- // Add in large value files which are references from internal keys
- // stored in the table files
- //
- // TODO(opt): this is O(# large values in db). If this becomes too slow,
- // we could store an auxiliary data structure indexed by internal key
- for (LargeValueMap::const_iterator it = large_value_refs_.begin();
- it != large_value_refs_.end();
- ++it) {
- const LargeValueRef& lref = it->first;
- for (LargeReferencesSet::const_iterator it2 = it->second.begin();
- it2 != it->second.end();
- ++it2) {
- if (icmp_.Compare(it2->second, ikey.Encode()) <= 0) {
- // Internal key for large value is before our key of interest
- result += lref.ValueSize();
- }
- }
- }
-
-
return result;
}
-bool VersionSet::RegisterLargeValueRef(const LargeValueRef& large_ref,
- uint64_t fnum,
- const InternalKey& internal_key) {
- LargeReferencesSet* refs = &large_value_refs_[large_ref];
- bool is_first = refs->empty();
- refs->insert(make_pair(fnum, internal_key.Encode().ToString()));
- return is_first;
-}
-
-void VersionSet::CleanupLargeValueRefs(const std::set<uint64_t>& live_tables) {
- for (LargeValueMap::iterator it = large_value_refs_.begin();
- it != large_value_refs_.end();
- ) {
- LargeReferencesSet* refs = &it->second;
- for (LargeReferencesSet::iterator ref_it = refs->begin();
- ref_it != refs->end();
- ) {
- if (ref_it->first != log_number_ && // Not in log file
- ref_it->first != prev_log_number_ && // Not in prev log
- live_tables.count(ref_it->first) == 0) { // Not in a live table
- // No longer live: erase
- LargeReferencesSet::iterator to_erase = ref_it;
- ++ref_it;
- refs->erase(to_erase);
- } else {
- // Still live: leave this reference alone
- ++ref_it;
- }
- }
- if (refs->empty()) {
- // No longer any live references to this large value: remove from
- // large_value_refs
- Log(env_, options_->info_log, "large value is dead: '%s'",
- LargeValueRefToFilenameString(it->first).c_str());
- LargeValueMap::iterator to_erase = it;
- ++it;
- large_value_refs_.erase(to_erase);
- } else {
- ++it;
- }
- }
-}
-
-bool VersionSet::LargeValueIsLive(const LargeValueRef& large_ref) {
- LargeValueMap::iterator it = large_value_refs_.find(large_ref);
- if (it == large_value_refs_.end()) {
- return false;
- } else {
- assert(!it->second.empty());
- return true;
- }
-}
-
void VersionSet::MaybeDeleteOldVersions() {
// Note: it is important to delete versions in order since a newer
// version with zero refs may be holding a pointer to a memtable
@@ -793,7 +700,7 @@ void VersionSet::AddLiveFiles(std::set<uint64_t>* live) {
for (Version* v = oldest_; v != NULL; v = v->next_) {
for (int level = 0; level < config::kNumLevels; level++) {
const std::vector<FileMetaData*>& files = v->files_[level];
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
live->insert(files[i]->number);
}
}
@@ -810,7 +717,7 @@ int64_t VersionSet::MaxNextLevelOverlappingBytes() {
int64_t result = 0;
std::vector<FileMetaData*> overlaps;
for (int level = 0; level < config::kNumLevels - 1; level++) {
- for (int i = 0; i < current_->files_[level].size(); i++) {
+ for (size_t i = 0; i < current_->files_[level].size(); i++) {
const FileMetaData* f = current_->files_[level][i];
GetOverlappingInputs(level+1, f->smallest, f->largest, &overlaps);
const int64_t sum = TotalFileSize(overlaps);
@@ -832,7 +739,7 @@ void VersionSet::GetOverlappingInputs(
Slice user_begin = begin.user_key();
Slice user_end = end.user_key();
const Comparator* user_cmp = icmp_.user_comparator();
- for (int i = 0; i < current_->files_[level].size(); i++) {
+ for (size_t i = 0; i < current_->files_[level].size(); i++) {
FileMetaData* f = current_->files_[level][i];
if (user_cmp->Compare(f->largest.user_key(), user_begin) < 0 ||
user_cmp->Compare(f->smallest.user_key(), user_end) > 0) {
@@ -852,7 +759,7 @@ void VersionSet::GetRange(const std::vector<FileMetaData*>& inputs,
assert(!inputs.empty());
smallest->Clear();
largest->Clear();
- for (int i = 0; i < inputs.size(); i++) {
+ for (size_t i = 0; i < inputs.size(); i++) {
FileMetaData* f = inputs[i];
if (i == 0) {
*smallest = f->smallest;
@@ -895,7 +802,7 @@ Iterator* VersionSet::MakeInputIterator(Compaction* c) {
if (!c->inputs_[which].empty()) {
if (c->level() + which == 0) {
const std::vector<FileMetaData*>& files = c->inputs_[which];
- for (int i = 0; i < files.size(); i++) {
+ for (size_t i = 0; i < files.size(); i++) {
list[num++] = table_cache_->NewIterator(
options, files[i]->number, files[i]->file_size);
}
@@ -927,7 +834,7 @@ Compaction* VersionSet::PickCompaction() {
c->input_version_->Ref();
// Pick the first file that comes after compact_pointer_[level]
- for (int i = 0; i < current_->files_[level].size(); i++) {
+ for (size_t i = 0; i < current_->files_[level].size(); i++) {
FileMetaData* f = current_->files_[level][i];
if (compact_pointer_[level].empty() ||
icmp_.Compare(f->largest.Encode(), compact_pointer_[level]) > 0) {
@@ -1062,7 +969,7 @@ bool Compaction::IsTrivialMove() const {
void Compaction::AddInputDeletions(VersionEdit* edit) {
for (int which = 0; which < 2; which++) {
- for (int i = 0; i < inputs_[which].size(); i++) {
+ for (size_t i = 0; i < inputs_[which].size(); i++) {
edit->DeleteFile(level_ + which, inputs_[which][i]->number);
}
}