leveldb
Classes | Public Member Functions | Private Types | Private Attributes | List of all members
leveldb::VersionSet::Builder Class Reference
Collaboration diagram for leveldb::VersionSet::Builder:
Collaboration graph
[legend]

Classes

struct  BySmallestKey
 
struct  LevelState
 

Public Member Functions

 Builder (VersionSet *vset, Version *base)
 
 ~Builder ()
 
void Apply (VersionEdit *edit)
 
void SaveTo (Version *v)
 
void MaybeAddFile (Version *v, int level, FileMetaData *f)
 

Private Types

typedef std::set< FileMetaData *, BySmallestKeyFileSet
 

Private Attributes

VersionSetvset_
 
Versionbase_
 
LevelState levels_ [config::kNumLevels]
 

Detailed Description

Definition at line 603 of file version_set.cc.


Class Documentation

§ leveldb::VersionSet::Builder::LevelState

struct leveldb::VersionSet::Builder::LevelState

Definition at line 621 of file version_set.cc.

Class Members
FileSet * added_files
set< uint64_t > deleted_files

Member Typedef Documentation

§ FileSet

Definition at line 620 of file version_set.cc.

Constructor & Destructor Documentation

§ Builder()

leveldb::VersionSet::Builder::Builder ( VersionSet vset,
Version base 
)
inline

Definition at line 632 of file version_set.cc.

633  : vset_(vset),
634  base_(base) {
635  base_->Ref();
636  BySmallestKey cmp;
637  cmp.internal_comparator = &vset_->icmp_;
638  for (int level = 0; level < config::kNumLevels; level++) {
639  levels_[level].added_files = new FileSet(cmp);
640  }
641  }
std::set< FileMetaData *, BySmallestKey > FileSet
Definition: version_set.cc:620
static const int kNumLevels
Definition: dbformat.h:22
LevelState levels_[config::kNumLevels]
Definition: version_set.cc:628
const InternalKeyComparator icmp_
Definition: version_set.h:301
Here is the call graph for this function:

§ ~Builder()

leveldb::VersionSet::Builder::~Builder ( )
inline

Definition at line 643 of file version_set.cc.

643  {
644  for (int level = 0; level < config::kNumLevels; level++) {
645  const FileSet* added = levels_[level].added_files;
646  std::vector<FileMetaData*> to_unref;
647  to_unref.reserve(added->size());
648  for (FileSet::const_iterator it = added->begin();
649  it != added->end(); ++it) {
650  to_unref.push_back(*it);
651  }
652  delete added;
653  for (uint32_t i = 0; i < to_unref.size(); i++) {
654  FileMetaData* f = to_unref[i];
655  f->refs--;
656  if (f->refs <= 0) {
657  delete f;
658  }
659  }
660  }
661  base_->Unref();
662  }
std::set< FileMetaData *, BySmallestKey > FileSet
Definition: version_set.cc:620
static const int kNumLevels
Definition: dbformat.h:22
LevelState levels_[config::kNumLevels]
Definition: version_set.cc:628
Here is the call graph for this function:

Member Function Documentation

§ Apply()

void leveldb::VersionSet::Builder::Apply ( VersionEdit edit)
inline

Definition at line 665 of file version_set.cc.

665  {
666  // Update compaction pointers
667  for (size_t i = 0; i < edit->compact_pointers_.size(); i++) {
668  const int level = edit->compact_pointers_[i].first;
669  vset_->compact_pointer_[level] =
670  edit->compact_pointers_[i].second.Encode().ToString();
671  }
672 
673  // Delete files
674  const VersionEdit::DeletedFileSet& del = edit->deleted_files_;
675  for (VersionEdit::DeletedFileSet::const_iterator iter = del.begin();
676  iter != del.end();
677  ++iter) {
678  const int level = iter->first;
679  const uint64_t number = iter->second;
680  levels_[level].deleted_files.insert(number);
681  }
682 
683  // Add new files
684  for (size_t i = 0; i < edit->new_files_.size(); i++) {
685  const int level = edit->new_files_[i].first;
686  FileMetaData* f = new FileMetaData(edit->new_files_[i].second);
687  f->refs = 1;
688 
689  // We arrange to automatically compact this file after
690  // a certain number of seeks. Let's assume:
691  // (1) One seek costs 10ms
692  // (2) Writing or reading 1MB costs 10ms (100MB/s)
693  // (3) A compaction of 1MB does 25MB of IO:
694  // 1MB read from this level
695  // 10-12MB read from next level (boundaries may be misaligned)
696  // 10-12MB written to next level
697  // This implies that 25 seeks cost the same as the compaction
698  // of 1MB of data. I.e., one seek costs approximately the
699  // same as the compaction of 40KB of data. We are a little
700  // conservative and allow approximately one seek for every 16KB
701  // of data before triggering a compaction.
702  f->allowed_seeks = (f->file_size / 16384);
703  if (f->allowed_seeks < 100) f->allowed_seeks = 100;
704 
705  levels_[level].deleted_files.erase(f->number);
706  levels_[level].added_files->insert(f);
707  }
708  }
LevelState levels_[config::kNumLevels]
Definition: version_set.cc:628
std::set< std::pair< int, uint64_t > > DeletedFileSet
Definition: version_edit.h:87
std::string compact_pointer_[config::kNumLevels]
Definition: version_set.h:316
Here is the caller graph for this function:

§ MaybeAddFile()

void leveldb::VersionSet::Builder::MaybeAddFile ( Version v,
int  level,
FileMetaData f 
)
inline

Definition at line 759 of file version_set.cc.

759  {
760  if (levels_[level].deleted_files.count(f->number) > 0) {
761  // File is deleted: do nothing
762  } else {
763  std::vector<FileMetaData*>* files = &v->files_[level];
764  if (level > 0 && !files->empty()) {
765  // Must not overlap
766  assert(vset_->icmp_.Compare((*files)[files->size()-1]->largest,
767  f->smallest) < 0);
768  }
769  f->refs++;
770  files->push_back(f);
771  }
772  }
virtual int Compare(const Slice &a, const Slice &b) const
Definition: dbformat.cc:50
LevelState levels_[config::kNumLevels]
Definition: version_set.cc:628
const InternalKeyComparator icmp_
Definition: version_set.h:301
Here is the call graph for this function:

§ SaveTo()

void leveldb::VersionSet::Builder::SaveTo ( Version v)
inline

Definition at line 711 of file version_set.cc.

711  {
712  BySmallestKey cmp;
713  cmp.internal_comparator = &vset_->icmp_;
714  for (int level = 0; level < config::kNumLevels; level++) {
715  // Merge the set of added files with the set of pre-existing files.
716  // Drop any deleted files. Store the result in *v.
717  const std::vector<FileMetaData*>& base_files = base_->files_[level];
718  std::vector<FileMetaData*>::const_iterator base_iter = base_files.begin();
719  std::vector<FileMetaData*>::const_iterator base_end = base_files.end();
720  const FileSet* added = levels_[level].added_files;
721  v->files_[level].reserve(base_files.size() + added->size());
722  for (FileSet::const_iterator added_iter = added->begin();
723  added_iter != added->end();
724  ++added_iter) {
725  // Add all smaller files listed in base_
726  for (std::vector<FileMetaData*>::const_iterator bpos
727  = std::upper_bound(base_iter, base_end, *added_iter, cmp);
728  base_iter != bpos;
729  ++base_iter) {
730  MaybeAddFile(v, level, *base_iter);
731  }
732 
733  MaybeAddFile(v, level, *added_iter);
734  }
735 
736  // Add remaining base files
737  for (; base_iter != base_end; ++base_iter) {
738  MaybeAddFile(v, level, *base_iter);
739  }
740 
741 #ifndef NDEBUG
742  // Make sure there is no overlap in levels > 0
743  if (level > 0) {
744  for (uint32_t i = 1; i < v->files_[level].size(); i++) {
745  const InternalKey& prev_end = v->files_[level][i-1]->largest;
746  const InternalKey& this_begin = v->files_[level][i]->smallest;
747  if (vset_->icmp_.Compare(prev_end, this_begin) >= 0) {
748  fprintf(stderr, "overlapping ranges in same level %s vs. %s\n",
749  prev_end.DebugString().c_str(),
750  this_begin.DebugString().c_str());
751  abort();
752  }
753  }
754  }
755 #endif
756  }
757  }
virtual int Compare(const Slice &a, const Slice &b) const
Definition: dbformat.cc:50
std::vector< FileMetaData * > files_[config::kNumLevels]
Definition: version_set.h:138
std::set< FileMetaData *, BySmallestKey > FileSet
Definition: version_set.cc:620
static const int kNumLevels
Definition: dbformat.h:22
LevelState levels_[config::kNumLevels]
Definition: version_set.cc:628
const InternalKeyComparator icmp_
Definition: version_set.h:301
void MaybeAddFile(Version *v, int level, FileMetaData *f)
Definition: version_set.cc:759
Here is the call graph for this function:
Here is the caller graph for this function:

Member Data Documentation

§ base_

Version* leveldb::VersionSet::Builder::base_
private

Definition at line 627 of file version_set.cc.

§ levels_

LevelState leveldb::VersionSet::Builder::levels_[config::kNumLevels]
private

Definition at line 628 of file version_set.cc.

§ vset_

VersionSet* leveldb::VersionSet::Builder::vset_
private

Definition at line 626 of file version_set.cc.


The documentation for this class was generated from the following file: